Flutter bloc:BlocBuilder 在第一次声明状态时不会重新调用构建器方法
Flutter bloc: BlocBuilder does not re-call builder method when stated state first time
我正在尝试使用 bloc 更改我的 flutter 应用程序的主题。
但是从第二次状态改变后我就遇到了问题
Sate 还在更新,但是 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);
}
),
);
}
}
当标签按钮
onTap: () {
print("_ChangeThemeScreenState " + itemAppTheme.toString());
BlocProvider.of<ThemeBloc>(context)
.add(ThemeChanged(theme: itemAppTheme));
},
在你的 ThemeState
class 中,尝试将你的 themeData
属性 传递给道具,我很确定我刚才和你有同样的问题.据我了解,您为 props
设置的值是 bloc
在决定是否重建小部件时实际查看的值。
我认为这样的事情应该可行:
List<Object> get props => [themeData]
你显然还需要正确地 yield 这个状态。
我正在尝试使用 bloc 更改我的 flutter 应用程序的主题。 但是从第二次状态改变后我就遇到了问题
Sate 还在更新,但是 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);
}
),
);
}
}
当标签按钮
onTap: () {
print("_ChangeThemeScreenState " + itemAppTheme.toString());
BlocProvider.of<ThemeBloc>(context)
.add(ThemeChanged(theme: itemAppTheme));
},
在你的 ThemeState
class 中,尝试将你的 themeData
属性 传递给道具,我很确定我刚才和你有同样的问题.据我了解,您为 props
设置的值是 bloc
在决定是否重建小部件时实际查看的值。
我认为这样的事情应该可行:
List<Object> get props => [themeData]
你显然还需要正确地 yield 这个状态。