flutter - Flutter bloc:BlocBuilder 在第一次声明状态时不会重新调用构建器方法
问题描述
我正在尝试使用 bloc 更改我的颤振应用程序的主题。但是自从第二次改变状态后我就遇到了问题。
状态还在更新,但是 UI 没有改变,builder 方法没有再次运行
我的日志:
Performing hot restart...
Syncing files to device iPhone 11...
Restarted application in 1,386ms.
flutter: builder ThemeState
flutter: builder ThemeState
flutter: build
flutter: _ChangeThemeScreenState AppTheme.BlueDark
flutter: ThemeBloc AppTheme.BlueDark
flutter: ThemeBloc isThemeChange
flutter: builder ThemeState
flutter: _ChangeThemeScreenState AppTheme.BlueLight
flutter: ThemeBloc AppTheme.BlueLight
flutter: ThemeBloc isThemeChange
flutter: _ChangeThemeScreenState AppTheme.GreenDark
flutter: ThemeBloc AppTheme.GreenDark
flutter: ThemeBloc isThemeChange
我的代码:
class ThemeBloc extends Bloc<ThemeEvent, ThemeState> {
ThemeBloc() : super(ThemeState(themeData: appThemeData[AppTheme.GreenLight]));
@override
Stream<ThemeState> mapEventToState(
ThemeEvent event,
) async* {
print("ThemeBloc " + (event as ThemeChanged).theme.toString());
if (event is ThemeChanged) {
print("ThemeBloc " +'isThemeChange');
yield ThemeState(themeData: appThemeData[event.theme]);
}
}
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => ThemeBloc(),
child: BlocBuilder<ThemeBloc, ThemeState>(
builder: (context, state) {
print("builder " + state.toString());
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Bitradez',
routes: routes,
theme: state.themeData);
}
),
);
}
}
when tab button
onTap: () {
print("_ChangeThemeScreenState " + itemAppTheme.toString());
BlocProvider.of<ThemeBloc>(context)
.add(ThemeChanged(theme: itemAppTheme));
},
解决方案
在你的ThemeState
课堂上,尝试将你的themeData
属性传递给道具,我很确定我前一段时间遇到了和你一样的问题。据我了解,您为 设置的值props
是bloc
在决定是否重建小部件时实际查看的值。
我认为这样的事情应该有效:
List<Object> get props => [themeData]
你显然仍然需要正确地产生这个状态。
推荐阅读
- javascript - 如何在 ES5 中使用 Promise
- java - AudioTrack - IllegalStateException:在未初始化的 AudioTrack 上调用 play()
- javascript - 按标题名称检索 Google 表格列
- android - 如何构建 ViewPager 来滑动大图像?
- javascript - JS 中的 Gcloud pubsub worker
- javascript - {z}/{x}/{y} 在“tiles”中是什么意思:[location.origin+location.pathname+"countries/{z}/{x}/{y}.pbf"],
- ios - 为什么我不能使用 `isCalculating` 属性来等待计算请求完成
- amazon-redshift - 对表的所有列应用 MAX(LENGTH)
- javascript - Chrome 没有从服务器获取我的新代码。我该如何解决?
- c# - 从powershell调用api时,空值来自Post方法(FromBody)