我有一个MaterialApp
小部件,它为应用程序中的所有小部件设置theme
。我想在运行时从一个没有任何直接引用其父小部件MaterialApp
的子小部件更改MaterialApp
的theme
值。
这似乎是可能的,因为ThemeData
是由InheritedWidget
提供的,但我不知道如何批量更改theme
。有人知道如何做到这一点吗?
下面是拥有应用程序其余部分的MaterialApp
:
new MaterialApp(
title: 'App Name',
theme: initialTheme,
routes: <String, WidgetBuilder>{
'/' : ...,
},
),
9条答案
按热度按时间b5buobof1#
您也可以使用
StreamController
。只需复制并粘贴此代码。这是一个工作示例。您不需要任何库,而且非常简单
0wi1tuuw2#
根据Dan Field的建议,我得出了以下解决方案。如果有人有改进意见,请随时插话:
7d7tgy0s3#
这是这里回答的问题的一个具体情况:How to force Flutter to rebuild / redraw all widgets?
看看问题中提到的股票样本,特别注意:https://github.com/flutter/flutter/blob/e7b7ebc066c1b2a5aa5c19f8961307427e0142a6/dev/benchmarks/test_apps/stocks/lib/main.darthttps://github.com/flutter/flutter/blob/e7b7ebc066c1b2a5aa5c19f8961307427e0142a6/dev/benchmarks/test_apps/stocks/lib/stock_settings.dart
请注意以下事项:
1.主题由
_configuration
指定,并由configurationUpdater
更新configurationUpdater
将传递给需要它的应用子级1.孩子们可以调用configurationUpdater,它反过来在应用程序的根目录设置状态,然后使用指定的主题重新绘制应用程序
vql8enpb4#
您可以使用**Provider**更改此设置。
1-您必须在pubspec.yaml文件中添加提供程序
2-从ChangeNotifier扩展类以更改主题并保留当前主题
3-将ChangeNotifierProvider添加为runApp的子级
4-在启动应用程序时获取当前主题
5-在其他类中切换主题
vq8itlhq5#
您可以将provider软件包中的ChangeNotifierProvider/Consumer与ChangeNotifier后续产品组合使用。
vmjh9lq96#
下面是我使用内置flutter的状态管理解决方案
ChangeNotifier
的方法,每当Settings
类中的数据成员(本例中为ThemeMode)发生变化时,使用AnimatedBuilder构建MaterialApp。下面是dartpad演示,尝试https://dartpad.dev/?id=c81eccd13f45568ee10c4d160f1560c9
t3irkdon7#
简单示例
在运行时更改主题/使用StatefulWidget
此复制/粘贴示例使用
StatefulWidget
在运行时在亮/暗主题之间更改应用主题。(This是Android Studio中自动生成的Flutter示例应用,已修改。)
什么改变了
1.将
MyApp
从StatelessWidget
更改为StatefulWidget
(MyStatefulApp
)1.添加到
MyStatefulApp
的静态of(context)
方法(从后代中查找State
对象)changeTheme()
方法已添加到State
对象1.对
_incrementCounter
的FAB按钮调用将setState
重建委托给MyStatefulApp.of(context).changeTheme()
。此处无需调用setState
。注解
MaterialApp
提供一个darkTheme
和themeMode
参数,只需在ThemeMode.light
和ThemeMode.dark
之间更改themeMode
,而不是每次都更改theme
参数。使用themeMode
将支持iOS 13/Android 10以上的设备范围暗模式。上面的示例是按原样完成的,目的是尽可能简单/直接地回答问题,但对于此特定用例来说并不理想。5ktev3wc8#
经过各种尝试之后,我使用BLoC模式进行了测试,我不知道这是否是一个好方法,但它似乎没有任何问题:
应用主题模型:
应用程序BLoC类。这里我使用了RxDart的BehaviorSubject。
在应用的设置页面中,我使用_theme流来设置主题列表下拉菜单的当前主题,使用onChanged处理程序,当用户点击主题时,主题将被发送到流:
最后,在主页中,使用StreamBuilder,我使用_theme流来设置选定的ThemeData:
_BuildThemeData方法从主题模型获取ThemeData:
希望这对你有用。
qlfbtfca9#
在@SuperDeclarative Answer之后执行以下操作
制作材料应用程序时位于主省道
在要更改主题的任何其他类中
1.从其他班级更改主题时保存到共享首选项
1.启动前检查此首选项并打开此主题的应用程序
1.打开后,按照上面的代码从任何其他类