如何在Flutter中更改运行时的应用主题?

哈桑

在我的简单项目中,有一个按钮可以将主题形式的浅色更改为深色,反之亦然,如下所示:

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:async';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  MyAppState createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  Future<bool> load(String key, bool defaultValue) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    bool state = prefs.getBool(key) ?? defaultValue;
    return state;
  }

  Future<void> save(String key, bool value) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setBool(key, value);
  }

  bool state;

  @override
  Widget build(BuildContext context) {
    load("themeKey", false).then((bool value) {
      state = value;
    });
    debugPrint(
        "..............state is : " + state.toString() + "...............");
    return MaterialApp(
      theme: state ? ThemeData.light() : ThemeData.dark(),
      home: Scaffold(
        body: Container(
          child: RaisedButton(
            child: Text("change"),
            onPressed: () {
              setState(() {
                state = !state;
              });
              save("themeKey", state);
            },
          ),
        ),
      ),
    );
  }
}

我使用shared_preferences插件保存了下一次启动应用程序的当前主题状态,但是似乎有一个问题,即应用程序在共享首选项加载之前就已加载,因此我遇到了这个异常

Launching lib\main.dart on C1905 in debug mode...
Built build\app\outputs\apk\debug\app-debug.apk.
I/flutter ( 8045): ..............state is : null...............
I/flutter ( 8045): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 8045): The following assertion was thrown building MyApp(dirty, state: MyAppState#6774f):
I/flutter ( 8045): Failed assertion: boolean expression must not be null
I/flutter ( 8045): Either the assertion indicates an error in the framework itself, or we should provide substantially
I/flutter ( 8045): more information in this error message to help you determine and fix the underlying cause.
I/flutter ( 8045): In either case, please report this assertion by filing a bug on GitHub:
I/flutter ( 8045):   https://github.com/flutter/flutter/issues/new?template=BUG.md
I/flutter ( 8045): When the exception was thrown, this was the stack:
I/flutter ( 8045): #0      MyAppState.build (package:test_shared_preferenced/main.dart:36:14)
I/flutter ( 8045): #1      StatefulElement.build (package:flutter/src/widgets/framework.dart:3787:27)
I/flutter ( 8045): #2      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3699:15)
I/flutter ( 8045): #3      Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5)
I/flutter ( 8045): #4      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3679:5)
I/flutter ( 8045): #5      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3826:11)
I/flutter ( 8045): #6      ComponentElement.mount (package:flutter/src/widgets/framework.dart:3674:5)
I/flutter ( 8045): #7      Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
I/flutter ( 8045): #8      Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
I/flutter ( 8045): #9      RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:909:16)
I/flutter ( 8045): #10     RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:880:5)
I/flutter ( 8045): #11     RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:826:17)
I/flutter ( 8045): #12     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2266:19)
I/flutter ( 8045): #13     RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:825:13)
I/flutter ( 8045): #14     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:712:7)
I/flutter ( 8045): #15     runApp (package:flutter/src/widgets/binding.dart:756:7)
I/flutter ( 8045): #16     main (package:test_shared_preferenced/main.dart:5:16)
I/flutter ( 8045): #17     _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:289:19)
I/flutter ( 8045): #18     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)
I/flutter ( 8045): ════════════════════════════════════════════════════════════════════════════════════════════════════

所以在这种情况下我该怎么办,请帮忙

史提芬

load方法返回的aFuture将与其余代码异步运行。当执行到达debugPrint或随后的return语句时,不能保证该then块已完成其执行。您收到的错误证实了这一点。state布尔尚未设定的值,但-它仍然是空的。

使用aFutureBuilder可以帮助您处理正在等待Future构建小部件树的情况。

https://www.dartlang.org/tutorials/language/futures值得阅读。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Flutter:如何在运行时更改MaterialApp主题

如何在Android运行时更改当前主题

在运行时更改Polymer应用程序的主题

在运行时更改应用程序主题

应用运行时如何更改NavigationBarColor

如何在运行时使用 style.xml 更改活动的主题

如何在运行时设置任意主题颜色

如何在运行时更改Safari应用程序扩展中的工具栏图标?

在运行时更改主题

运行时更改Android材料主题

更改引导主题运行时

如何在运行时使用Appcelerator更改语言应用

如何在运行时更改应用程序环境?

如何在运行时更改应用程序输出类型

如何在运行时禁用Crashlytics以响应用户首选项更改?

如何在运行时更改android应用程序的名称和图标?

Xamarin:如何在运行时将以下 android 主题应用于我的活动?

如何在单击时在运行时为整个应用程序设置自定义主题?

当应用未运行时,如何在ReactNative应用中读取传入的SMS?

使用Gunicorn运行时如何在运行时更改flask配置变量

如何在WPF中运行时在Listview中更改Image?

在 ASP.NET Core Angular 应用程序运行时更改主题的热门话题

如何在运行时更改TimerTask的执行周期?

如何在运行时更改NLog规则目标?

如何在运行时更改实现

如何在运行时更改按钮形状样式?

如何在Spring的运行时更改属性值

如何在运行时更改TextView的样式

如何在openscenegraph上的运行时更改背景