如何在Flutter中使用设备的默认字体?

10
我打开了一款Java本地安卓应用程序和一款Flutter安卓应用程序,并在同一设备上对两个应用程序进行了截图:

Java(左)和Flutter(右)应用程序的截图

如您所见,它们用于显示文本的字体不同。这两个应用程序都是使用三星Galaxy S5 Choco Cooky默认主题运行的。
Java本地应用程序适配并显示自定义的三星Galaxy字体,而Flutter应用程序未调整字体。
我该如何配置我的Flutter应用程序以使用设备的默认字体?

Flutter不使用OEM小部件,所以我猜在找到某些黑客方法之前这是不可能的。 - ibhavikmakwana
你可以使用自定义字体。 - ibhavikmakwana
@ibhavikmakwana 好的,谢谢。 - Favor
https://medium.com/flutter-io/why-flutter-doesnt-use-oem-widgets-94746e812510 - ibhavikmakwana
https://medium.com/flutter-community/flutter-platformview-how-to-create-flutter-widgets-from-native-views-366e378115b6 - ibhavikmakwana
2个回答

4
创建一个PlatformChannels,并将Android中的TextView访问到你的Flutter应用程序中。使用它来替代Flutter中的Text小部件。
查看此文章获取更多信息。

3
在Flutter中,Android设备的默认字体是Roboto,iOS设备的默认字体是.SF UI Pro和.SF UI Text。
查看此答案https://dev59.com/zFQJ5IYBdhLWcg3w5aIc#56339147 在iOS上这很好,但在Android上有很多带有不同默认字体系列的ROM。
为了获取设备的默认字体系列,在Android上编写了一个平台通道,以下是获取设备默认字体系列的代码:
private String getDefaultFont() {
        File configFilename = new File("/system/etc/system_fonts.xml");
        // sans-serif is the default font family name in Android SDK, check out the code in Typeface.java
        String defaultFontName = "sans-serif";

        try {
            FileInputStream fontsIn = new FileInputStream(configFilename);
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(fontsIn, null);
            boolean done = false;
            boolean getTheText = false;
            int eventType;
            while (!done) {
                eventType = parser.next();
                if (eventType == parser.START_TAG && parser.getName().equalsIgnoreCase("name")) {
                    getTheText = true;
                }
                if (eventType == parser.TEXT && getTheText) {
                    // first name
                    defaultFontName = parser.getText();
                    done = true;
                }
                if (eventType == parser.END_DOCUMENT) {
                    done = true;
                }
            }
        } catch (RuntimeException e) {
            System.err.println("Didn't create default family (most likely, non-Minikin build)");
        } catch (FileNotFoundException e) {
            System.err.println("GetDefaultFont: config file Not found");
        } catch (IOException e) {
            System.err.println("GetDefaultFont: IO exception: " + e.getMessage());
        } catch (XmlPullParserException e) {
            System.err.println("getDefaultFont: XML parse exception " + e.getMessage());
        }
        return defaultFontName;
    }

Galaxy S10 上出现 FileNotFoundException。 - wonpyohong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接