Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振中的单例给出运行时错误“;未处理的异常:读取静态变量'_instance@545324594';在其初始化过程中“;_Flutter_Dart_Singleton_Mvp - Fatal编程技术网

Flutter 颤振中的单例给出运行时错误“;未处理的异常:读取静态变量'_instance@545324594';在其初始化过程中“;

Flutter 颤振中的单例给出运行时错误“;未处理的异常:读取静态变量'_instance@545324594';在其初始化过程中“;,flutter,dart,singleton,mvp,Flutter,Dart,Singleton,Mvp,我尝试在一个颤振应用程序(颤振版本1.12.13+hotfix8)中实现MVP模式。 我的控制器(演示者)是一个单例,如下所示: 导入“包装:颤振/材料.省道”; //本地文件导入 导入“包:prototype/gui/screens/welcome/welcome.dart”; //这是一个单身汉 类控制器{ 静态最终控制器_实例=控制器。_内部(); Widget\u currentWidget; 控制器。_内部(){ 这是。_currentWidget=ScreenWelcome(); }

我尝试在一个颤振应用程序(颤振版本1.12.13+hotfix8)中实现MVP模式。 我的控制器(演示者)是一个单例,如下所示:

导入“包装:颤振/材料.省道”;
//本地文件导入
导入“包:prototype/gui/screens/welcome/welcome.dart”;
//这是一个单身汉
类控制器{
静态最终控制器_实例=控制器。_内部();
Widget\u currentWidget;
控制器。_内部(){
这是。_currentWidget=ScreenWelcome();
}
factory Controller()=>\u实例;
Widget get currentWidget=>this.\u currentWidget;
设置当前小部件(小部件小部件){
_currentWidget=widget;
}
}
我的主屏幕如下所示:

导入“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
//本地文件导入
导入“包:原型/控制器/conroller.dart”;
导入“包:prototype/gui/screens/register/register.dart”;
导入“package:prototype/gui/screens/register/sign_in.dart”;
导入“package:prototype/gui/screens/text_viewer/text_viewer.dart”;
类ScreenWelcome扩展了无状态小部件{
最终控制器=控制器();
@凌驾
小部件构建(构建上下文){
返回容器(
子:SingleChildScrollView(
子:列(
儿童:[
Image.asset('resources/zombiepaar.jpg',
宽度:500,高度:500,尺寸:BoxFit.fitWidth),
大小盒子(
身高:20.0,
),
升起的按钮(
儿童:文本(“Ein neues Konto erstellen”),
按下:()=>\u controller.currentWidget=ScreenRegister(),
),
大小盒子(
身高:20.0,
),
升起的按钮(
儿童:文本(“Mit bestehendem Konto Einlogen”),
按下时:()=>\u controller.currentWidget=ScreenSignIn(),
),
大小盒子(
身高:20.0,
),
划船(
儿童:[
手势检测器(
子:文本(
“Nutzungsbedingungen”,
样式:TextStyle(
装饰:textEdition.underline,
颜色:颜色。蓝色),
),
onTap:()=>Navigator.push(
上下文
材料路线(
生成器:(上下文)=>ScreenTextViewer(
标题:“Nutzungsbedingungen”,
ressourceFileToLoad:'resources/AGBs.txt'),
)),
),
大小盒子(
宽度:20.0,
),
手势检测器(
子:文本(
“Datenschutzrichtlinien”,
样式:TextStyle(
装饰:textEdition.underline,
颜色:颜色。蓝色),
),
onTap:()=>Navigator.push(
上下文
材料路线(
生成器:(上下文)=>ScreenTextViewer(
标题:“Nutzungsbedingungen”,
ressourceFileToLoad:'resources/AGBs.txt'),
),
),
),
],
),
],
),
),
);
}
}
但当我运行我的应用程序时,出现以下运行时错误:

D/FlutterActivityAndFragmentDelegate(21372): Executing Dart entrypoint: main, and sending initial route: /
E/flutter (21372): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Reading static variable '_instance@545324594' during its initialization
E/flutter (21372): #0      Controller._instance (package:prototype/controller/conroller.dart:9:27)
E/flutter (21372): #1      new Controller (package:prototype/controller/conroller.dart:17:27)
E/flutter (21372): #2      new ScreenWelcome (package:prototype/gui/screens/welcome/welcome.dart:11:23)
E/flutter (21372): #3      new Controller._internal (package:prototype/controller/conroller.dart:14:27)
E/flutter (21372): #4      Controller._instance (package:prototype/controller/conroller.dart:9:50)
E/flutter (21372): #5      Controller._instance (package:prototype/controller/conroller.dart:9:27)
E/flutter (21372): #6      new Controller (package:prototype/controller/conroller.dart:17:27)
E/flutter (21372): #7      new MyApp (package:prototype/main.dart:10:22)
E/flutter (21372): #8      main (package:prototype/main.dart:6:23)
E/flutter (21372): #9      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:239:25)
E/flutter (21372): #10     _rootRun (dart:async/zone.dart:1126:13)
E/flutter (21372): #11     _CustomZone.run (dart:async/zone.dart:1023:19)
E/flutter (21372): #12     _runZoned (dart:async/zone.dart:1518:10)
E/flutter (21372): #13     runZoned (dart:async/zone.dart:1502:12)
E/flutter (21372): #14     _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:231:5)
E/flutter (21372): #15     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:307:19)
E/flutter (21372): #16     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174:12)

最后,我找到了答案:我必须尽可能晚地调用小部件的构造函数。因此,我在getter函数中调用了它。工作代码如下所示:

导入“包装:颤振/材料.省道”;
//本地文件导入
导入“包:prototype/gui/screens/welcome/welcome.dart”;
//这是一个单身汉
类控制器{
静态最终控制器_实例=控制器。_内部();
函数currentWidget;
控制器。_内部(){
这个。_currentWidget=()=>ScreenWelcome();
}
factory Controller()=>\u实例;
Widget get currentWidget=>this.\u currentWidget();
设置当前小部件(小部件小部件){
_currentWidget=()=>widget;
}
}

也许有一天它会帮助某人:)

你有一个循环依赖。创建
屏幕欢迎
调用
控制器
构造函数,该构造函数读取
\u实例
字段,该字段构造一个
控制器
,该字段创建一个
屏幕欢迎
。幸运的是,
\u instance
字段是惰性的,因为这样它就可以提前检测循环,而不是触发堆栈溢出

如果有两个类的最终字段必须相互指向。这基本上是不可能的。幸运的是,
\u currentWidget
不是最终的,因此在创建两个对象之后,您需要设置它

我会这样做:

类控制器{
静态最终_实例=控制器。u();
Widget\u currentWidget;
factory Controller()=>\u实例;
控制器;
}
班级欢迎{
最终控制人(u控制人),;
ScreenWelcome():_controller=controller(){
//这是对该小部件的最快引用。
_controller.currentWidget=this;
}
}
也许查看包并将您的实现与他们的实现进行比较会对您有所帮助。