【问题标题】:copyWith in ThemeData not work in MaterialAppThemeData 中的 copyWith 在 MaterialApp 中不起作用
【发布时间】:2021-06-10 20:04:38
【问题描述】:

如何在 ThemeData 中将 fontFamily 与 copyWith 一起使用或如何修复我的以下错误?

   class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Consumer2<ThemeNotifier, SettingNotifier>(builder:
            (context, ThemeNotifier theme, SettingNotifier settings, child) {
          return MaterialApp(
            theme: theme.getTheme().copyWith(
                  textTheme: theme.getTheme()
                      .textTheme
                      .apply(fontFamily: settings.getFontSetting()),
                ),
            debugShowCheckedModeBanner: false,
            home: MainHomePage(),
          );
        });
      }
    }

主题数据类如何在主题数据中添加 fontFamily 或在 copyWith 中添加文本主题我想在 MaterialApp 中将 textTheme 和 copyWith 添加到 getFonts 任何人都可以解决这个问题......................................................

class ThemeNotifier with ChangeNotifier {
  ThemeData _themeData;
  ThemeData getTheme() => _themeData;

  ThemeNotifier() {
    ThemeManager.readData('themeMode').then((value) {
      print('App Theme value read from storage: ' + value.toString());
      var themeMode = value;

      if (themeMode == 'yellow') {
        _themeData = yellow;
      } else {
        if (themeMode == 'red') {
          _themeData = red;
        } else {
          if (themeMode == 'green') {
            _themeData = green;
          } else {
            _themeData = orange;
          }
        }
      }
      notifyListeners();
    });
  }

  void setOrangeTheme() async {
    _themeData = orange;
    ThemeManager.saveData('themeMode', 'orange');
    notifyListeners();
  }

  void setRedTheme() async {
    _themeData = red;
    ThemeManager.saveData('themeMode', 'red');
    notifyListeners();
  }

  void setYellowTheme() async {
    _themeData = yellow;
    ThemeManager.saveData('themeMode', 'yellow');
    notifyListeners();
  }

  void setGreenTheme() async {
    _themeData = green;
    ThemeManager.saveData('themeMode', 'green');
    notifyListeners();
  }
}

【问题讨论】:

  • 嘿,欢迎来到 StackOverflow!添加问题时,您应该添加当前拥有的尽可能多的信息,因此如果您添加一些关于您得到什么错误、从theme.getTheme() 返回什么等等的上下文将会很有帮助。
  • 谢谢,theme.getTheme() = ThemeData 我用于更改具有共享偏好的应用主题
  • 你得到了什么错误?
  • 方法“copyWith”被称为空值。
  • 所以这意味着你的 ThemeNotifier 此时为空。您应该提供有关通知器及其提供位置的更多详细信息。

标签: flutter


【解决方案1】:

检查。这个

 ThemeData _buildDarkTheme() {
  final baseTheme = ThemeData(fontFamily: "Sunflower",);
    return baseTheme.copyWith(
   brightness: Brightness.dark,
     primaryColor: Colors.grey[800],
  accentColor: Colors.grey[850]);
} 

然后在我将其应用到我的应用程序时执行此操作,如下所示:

   class MyApp extends StatelessWidget {
MyApp({Key key}) : super(key: key);
 @override
Widget build(BuildContext context) {
  return new MaterialApp(
    theme: _buildDarkTheme(),
    home: new Scaffold(
      appBar: _buildAppBar(),
      body: new Container(
        color: Theme.of(context).accentColor,
        height: double.infinity,
        child:.....
    

【讨论】:

  • 这个 getTheme()
  • 类 ThemeNotifier 与 ChangeNotifier { ThemeData _themeData;主题数据 getTheme() => _themeData; ThemeNotifier() { ThemeManager.readData('themeMode').then((value) { print('从存储中读取的应用主题值:' + value.toString()); var themeMode = value;
  • if (themeMode == 'yellow') { _themeData = yellow; } else { if (themeMode == 'red') { _themeData = red; } else { if (themeMode == 'green') { _themeData = green; } 其他 { _themeData = 橙色; } } } notifyListeners(); }); }
  • void setOrangeTheme() async { _themeData = orange; ThemeManager.saveData('themeMode', 'orange');通知监听器(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2021-07-29
  • 2020-02-28
  • 2020-06-04
  • 2020-06-06
  • 2021-04-11
相关资源
最近更新 更多