首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在"BlocBuilder“中使用"MultiBlocProvider”时会出现错误

在"BlocBuilder“中使用"MultiBlocProvider”时会出现错误
EN

Stack Overflow用户
提问于 2021-11-28 09:21:35
回答 1查看 999关注 0票数 0

我是新来的颤音.I尝试谷歌,但我不能解决我的问题。我使用"MultiBlocProvider“来管理统计数据。我想改变黑暗模式的状态,就像低音一样。

ThemeCubit.dart

代码语言:javascript
复制
part 'theme_state.dart';

class ThemeCubit extends HydratedCubit<ThemeState> {
   ThemeCubit() : super(ThemeState(AppThemes.lightTheme));

   void getTheme(ThemeState state) {
       emit(state);
   }

  @override
  ThemeState? fromJson(Map<String, dynamic> json) {
    return json['isDark'] as bool
        ? ThemeState(AppThemes.darkTheme)
        : ThemeState(AppThemes.lightTheme);
  }

 @override
 Map<String, bool>? toJson(ThemeState state) {
    return {'isDark': state.themeData.brightness == Brightness.dark};
 }
}

ThemeState.dart

代码语言:javascript
复制
part of 'theme_cubit.dart';

@immutable
class ThemeState extends Equatable {
  final ThemeData themeData;

  const ThemeState(this.themeData);

  @override
  List<Object?> get props => [themeData];
}

main.dart

代码语言:javascript
复制
class MyApp extends StatelessWidget {
     const MyApp({Key? key}) : super(key: key);

    // This widget is the root of your application.
    @override
    Widget build(BuildContext context) {
        return  MultiBlocProvider(
           providers: [
              BlocProvider(
                  lazy: true,
                 create: (context) => ThemeCubit(),
              ),
           ],
          child:BlocBuilder<ThemeCubit, ThemeState>(
             builder: (context,state) {
                 return MaterialApp(           
                     debugShowCheckedModeBanner: false,            
                     title: 'Flutter Production Boilerplate',
                     theme: state.themeData, //ThemeMode.dark,
                     home: const MyHomePage(title: 'Flutter Demo Home Page'),
                 );
                },
               ),
              );
            }
         }

settingScreen.dart

代码语言:javascript
复制
Positioned(
                  top: 60 - widget.offset / 2,
                  left: 20,
                  child: Builder(builder: (context) {

                    return Switch(
                        value:newValue ,
                        onChanged: (value) {
                          BlocProvider.of<ThemeCubit>(context).getTheme(ThemeState(
                              newValue ? AppThemes.darkTheme : AppThemes.lightTheme));
                        });
                  })
            ),

当使用"BlocProvider“时,此代码工作正常。但是当我使用"MultiBlocProvider“时,我会发现错误很严重。

将以下断言附加到呈现树上:‘package:flutter/src/widgets/Frawork.dart’:Failed断言:第4357行pos 14:'owner!._debugCurrentBuildTarget == this':不是真。

断言指示框架本身中的错误,或者我们应该在此错误消息中提供更多的信息,以帮助您确定和修复根本原因。在这两种情况下,请通过在GitHub上提交一个bug来报告这一断言:

https://github.com/flutter/flutter/issues/new?template=2_bug.md

当抛出异常时,这是堆栈:#2 Element.rebuild。(package:flutter/src/widgets/framework.dart:4357:14) #3 Element.rebuild #4 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4643:5) #5 ComponentElement.mount #6 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3673:14) #7 (package:flutter/src/widgets/framework.dart:3425:18) #8 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1198:16) #9 RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:1167:5) #10 RenderObjectToWidgetAdapter.attachToRenderTree.(package:flutter/src/widgets/binding.dart:1112:18) #11 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2573:19) #12 RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:1111:13) #13 WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:944:7) #14 WidgetsBinding.scheduleAttachRootWidget。(package:flutter/src/widgets/binding.dart:924:7) (从类_AssertionError、类_RawReceivePortImpl、类_Timer、dart:异步和dart:异步修补程序中删除13帧)

我怎么才能修好它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-28 11:44:59

我在ThemeCubit.dart中添加了以下代码:

代码语言:javascript
复制
 bool isDarkMode = false;
 ThemeMode currentTheme(){
 isDarkMode?_setTheme(ThemeMode.dark) : _setTheme(ThemeMode.light);

      return isDarkMode?ThemeMode.dark : ThemeMode.light;
 }

 void updateTheme(bool isDarkMode) {
 this.isDarkMode = isDarkMode;

}

并更改main.dart

代码语言:javascript
复制
  Widget build(BuildContext context) {
     return  MultiBlocProvider(
        providers: [
           BlocProvider(
             create: (context) => ThemeCubit(),
          ),
       ],
       child:ElderlyApp(),     
    );
  }
  class ElderlyApp extends StatefulWidget {
     const ElderlyApp({Key? key,}) : super(key: key);
     @override
     _ElderlyAppState createState() => _ElderlyAppState();
  }

  class _ElderlyAppState extends State<ElderlyApp> with WidgetsBindingObserver {

     @override
       void initState() {
           WidgetsBinding.instance!.addObserver(this);
           super.initState();
       }

      @override
     void didChangePlatformBrightness() {
        context.read<ThemeCubit>().currentTheme();
       super.didChangePlatformBrightness();
     }

     @override
     void dispose() {
        WidgetsBinding.instance!.removeObserver(this);
        super.dispose();
    }
    @override
    Widget build(BuildContext context) {
        return MaterialApp(
        title: 'Flutter Production Boilerplate',
        theme: AppThemes.lightTheme,
        darkTheme: AppThemes.darkTheme,
        themeMode: context.select(
          (ThemeCubit cubit) => cubit.currentTheme()), //ThemeMode.dark,
        debugShowCheckedModeBanner: false,
        home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
   }
  }

和更改seetingScreen.dart中的代码

代码语言:javascript
复制
Positioned(
   top: 60 - widget.offset / 2,
   left: 20,
   child: Builder(builder: (context) {
   bool isDark = context.select((ThemeCubit themeCubit) =>
               themeCubit.state.themeMode) ==ThemeMode.dark ? true: false;
   return Switch(
                value: context.read<ThemeCubit>().isDarkMode,
                onChanged: (value) {
                context.read<ThemeCubit>().updateTheme(value);
              });
    })),
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70142045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档