首页 > 解决方案 > 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));
              },

标签: flutterbloc

解决方案


在你的ThemeState课堂上,尝试将你的themeData属性传递给道具,我很确定我前一段时间遇到了和你一样的问题。据我了解,您为 设置的值propsbloc在决定是否重建小部件时实际查看的值。

我认为这样的事情应该有效:

List<Object> get props => [themeData]

你显然仍然需要正确地产生这个状态。


推荐阅读