Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在颤栗中毫不迟疑地改变主题_Flutter_Flutter Provider - Fatal编程技术网

Flutter 在颤栗中毫不迟疑地改变主题

Flutter 在颤栗中毫不迟疑地改变主题,flutter,flutter-provider,Flutter,Flutter Provider,我正在使用提供商更改我应用程序中的主题。我的应用程序首先初始化为黑色主题 class ThemeNotifier extends ChangeNotifier { final String key = "them"; SharedPreferences _prefs; bool _darkTheme; bool get darkTheme => _darkTheme; ThemeNotifier() { _darkTheme = true; _loa

我正在使用提供商更改我应用程序中的主题。我的应用程序首先初始化为黑色主题

class ThemeNotifier extends ChangeNotifier {
  final String key = "them";
  SharedPreferences _prefs;
  bool _darkTheme;

  bool get darkTheme => _darkTheme;

  ThemeNotifier() {
    _darkTheme = true;
    _loadFromPrefs();
  }

  toggleTheme() {
    _darkTheme = !_darkTheme;
    _saveToPrefs();
    notifyListeners();
  }

  _loadFromPrefs() async {
    await _initPrefs();
    _darkTheme = _prefs.getBool(key) ?? true;
    notifyListeners();
  }

  _saveToPrefs() async {
    await _initPrefs();
    _prefs.setBool(key, _darkTheme);
  }

  _initPrefs() async {
    if (_prefs == null) _prefs = await SharedPreferences.getInstance();
  }
}
当我将它们更改为light时,我调用
toggleTheme
方法,并将暗主题更改为false

我使用的代码如下:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider.value(
      value: ThemeNotifier(),
      child: Consumer<ThemeNotifier>(
        builder: (context, notifire, child) {
          child:
          return MaterialApp(
            title: "theme",
            theme: notifire.darkTheme ? dark : light,
            home: HomeScreen(),
          );
        },
      ),
    );
  }
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider.value(
值:ThemeNotifier(),
儿童:消费者(
构建者:(上下文、通知、儿童){
儿童:
返回材料PP(
标题:“主题”,
主题:notifire.darkTheme?黑暗:光明,
主页:主屏幕(),
);
},
),
);
}
}
但当我用浅色主题更改应用程序并热加载应用程序一秒钟时,我的应用程序主题变暗,然后更改为浅色模式

当我使用光模式时,我如何在没有暗模式的情况下加载应用程序?这意味着当我将它们更改为光模式时,我甚至不想在几毫秒内显示暗模式

关于

当我使用光模式时,我如何在没有暗模式的情况下加载应用程序?这意味着当我将它们更改为光模式时,我甚至不想在几毫秒内显示暗模式

当您不想在几毫秒内显示暗模式时,有两个选项:

选项1:您应该等待
MaterialApp中的
FutureBuilder
中的
SharedReferences.getInstance()
并显示加载屏幕。加载屏幕将以浅或暗为主题,除非您独立于共享首选项中的主题对加载屏幕进行主题化

选项2:此选项对用户不太友好,因为它会在加载共享首选项之前的几毫秒内阻止任何渲染。在
main.dart
中的
main
功能中,可以执行以下操作:

void main() {
    SharedPreferences.getInstance().then(() => runApp(MyApp()));
}


编辑1

关于你的评论

I/flatter(10261):在生成使用者时抛出了以下断言(脏,依赖项:I/flatter(10261):[\u DefaultInheritedProviderScope]):I/flatter(10261):失败的断言:布尔表达式不能为null

我写道我也犯了同样的错误。在我的例子中,这个错误实际上起源于我的
build
方法中的某个地方,并且很难找到它。我建议使用
ChangeNotifierProvider(创建:ThemeNotifier(),…
over
ChangeNotifierProvider.value(值:ThemeNotifier(),…
)。有关详细信息,请查看


我的直觉是,断言错误源于
MaterialApp
中的行
主题:notifire.darkTheme?dark:light,
,如果您更改提供程序以创建更改通知程序,而不是重用现有的通知程序,它可能会得到修复。添加
--release
标志实际上只是一种解决方法nd忽略应用程序中的这种不稳定性。

尝试使用此ThemeNotifier(){u loadFromPrefs();}而不是ThemeNotifier(){u darkTheme=true;_loadFromPrefs();}如果我这样做,我会得到错误i/flatter(10261):在构建消费者时抛出以下断言(脏,依赖项:i/flatter(10261):[\u DefaultInheritedProviderScope]):I/flatter(10261):断言失败:布尔表达式不能为null@FederickJonathan@sayreskabir这里也有同样的问题。你能找到解决方案吗?在发布模式下,没关系。看起来你遵循了这一点。我也这么做了,遇到了与你相同的问题。你做了哪些特别的工作来让它工作?
void main() async {
    await SharedPreferences.getInstance();
    runApp(MyApp());
}