关于 viewService.context 不能及时生效的问题,求助
xinpiaoyuanfang opened this issue · 5 comments
在mac上使用android studio4.0 遇到一个bug,请教各位老师。
flutter版本1.17.4,fish_redux版本 0.3.4。
在main主函数中,我使用了 enent_bus对主题颜色进行了订阅,颜色主题进行了本地持久化,在MaterialApp的ThemeData中的primarySwatch使用了订阅颜色的变量。
class CreateApp extends StatefulWidget {
@OverRide
_CreateAppState createState() => _CreateAppState();
}
class _CreateAppState extends State {
Color _primaryColor;
bool _isDark;
StreamSubscription _colorSubscription;
StreamSubscription _darkSubscription;
@OverRide
void initState() {
// TODO: implement initState
super.initState();
_setThemeColor();
_setThemeDark();
//订阅eventbus
_colorSubscription = eventBus.on().listen((event) {
//缓存主题色
_cacheColor(event.colorId);
Color color = themeColors[event.colorId];
setState(() {
_primaryColor = color;
});
});
_darkSubscription = eventBus.on().listen((event) {
//缓存日间夜间模式
_cacheDark(event.darkLight);
bool dark = event.darkLight;
setState(() {
_isDark = dark;
});
});
}
_cacheColor(int colorId) async {
await StorageManager.init();
StorageManager.setThemeColor(colorId);
}
_cacheDark(bool dark) async {
await StorageManager.init();
StorageManager.setDark(dark);
}
Future _getCacheColor() async {
await StorageManager.init();
StorageManager.getThemeColor();
}
Future _getCacheDark() async {
await StorageManager.init();
StorageManager.getDark();
}
void _setThemeColor() async {
await _getCacheColor();
int cacheColorId = InitConstant.themeColorId;
Log.debug('main函数里的cacheColorId为【$cacheColorId】');
setState(() {
_primaryColor = themeColors[cacheColorId];
Log.debug('主题颜色是string【${_primaryColor.toString()}】');
});
}
void _setThemeDark() async {
await _getCacheDark();
bool dark = InitConstant.isDark;
setState(() {
_isDark = dark;
});
}
@OverRide
void dispose() {
// TODO: implement dispose
super.dispose();
//取消订阅
_colorSubscription.cancel();
_darkSubscription.cancel();
}
@OverRide
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
brightness: _isDark ?? false ? Brightness.dark : Brightness.light,
primarySwatch: _primaryColor ?? Colors.blue,
splashColor: Colors.transparent,
textTheme: TextTheme(
// TextField输入文字颜色
subhead: TextStyle(fontSize: Dimens.font_sp14, textBaseline: TextBaseline.alphabetic),
// Text文字样式
body1: TextStyle(fontSize: Dimens.font_sp14, textBaseline: TextBaseline.alphabetic),
subtitle: TextStyle(fontSize: Dimens.font_sp12, textBaseline: TextBaseline.alphabetic, fontWeight: FontWeight.normal),
),
cupertinoOverrideTheme: CupertinoThemeData(
brightness: _isDark ?? false ? Brightness.dark : Brightness.light,
),
),
///路由初始化
onGenerateRoute: (RouteSettings setting) {
return MaterialPageRoute<Object>(builder: (BuildContext context) {
return routes.buildPage(setting.name, setting.arguments);
});
},
/// 国际化
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
const Locale('zh', 'CN'),
const Locale('en', 'US'),
],
home: strNoEmpty(InitConstant.logTellerId) && strNoEmpty(InitConstant.logTokenKey)
? routes.buildPage('entryPage', null)
: routes.buildPage('loginPage', null));
}
}
而在我的view.dart 文件代码中,如果使用 color: Theme.of(viewService.context).accentColor ,颜色不会跟着当前的主题颜色变化而变化,而是用了上一个主题颜色, 但时如果我 使用color: Theme.of(context).accentColor 这样的代码,颜色就会随着主题颜色的变化而变化。
从两段代码上看,当我把ListTile封装到ListView.builder里面,并使用context,就没有问题;如果直接使用了 viewService.context的 颜色就不会随着主题颜色的变化而变化。
各位从mac上调试的时候是否遇到过这种问题??
windows环境编译出来的就没有问题,为什么呀,快这么疯了
确认下 enent_bus对主题颜色进行了订阅,然后产生了确认的组件的刷新。
不刷新,当然是无效的。
确认下 enent_bus对主题颜色进行了订阅,然后产生了确认的组件的刷新。
不刷新,当然是无效的。
同样的代码在 windows操作系统里的android studio 生成是没有问题的,
而且我添加里打印,每次换主题颜色的时候_primaryColor也会变成当前选的颜色,但是viewService.context就不会变。
Widget build(BuildContext context) {
print('${_primaryColor.toString()}');
return MaterialApp(
debugShowCheckedModeBanner: false,
我上传里一段demo代码,麻烦帮忙看一下呗。
git@github.com:xinpiaoyuanfang/viewContext.git
我确实订阅了event_bus。
为了验证这个问题,我用stful 做了一个 和fish_redux一样的 页面, 当切换主题的时候, stful这个页面的icon颜色可以随着主题颜色的变化而变化,可以 fish_redux 的 view里面的icon没有变、但是 appBar的颜色变了。
这个是我的例子,写的很简单,请各位老师帮忙看一下。
git@github.com:xinpiaoyuanfang/viewContext.git
还是没有解决。 是不是需要利用viewMiddleware进行重新渲染啊