Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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 在颤振中使用showDialog()后,Getx参数被清除_Flutter_Dart_Getx_Flutter Getx - Fatal编程技术网

Flutter 在颤振中使用showDialog()后,Getx参数被清除

Flutter 在颤振中使用showDialog()后,Getx参数被清除,flutter,dart,getx,flutter-getx,Flutter,Dart,Getx,Flutter Getx,执行showDialog方法后,将清除使用的Getx参数 _someMethod (BuildContext context) async { print(Get.arguments['myVariable'].toString()); // Value is available at this stage await showDialog( context: context, builder: (conte

执行showDialog方法后,将清除使用的Getx参数

    _someMethod (BuildContext context) async  {
       print(Get.arguments['myVariable'].toString()); // Value is available at this stage
        await showDialog(
            context: context,
            builder: (context) => new AlertDialog(
             //Simple logic to select between two buttons
); // get some Confirmation to execute some logic
    
       print(Get.arguments['myVariable'].toString()); // Variable is lost and an error is thrown

另外,我还想知道如何使用Getx显示snackbar,而不丢失前面的参数,如上所述。

一种方法是将数据复制到控制器内的一个变量中,并从中使用它,而不是直接从
Get.arguments
中使用它,因此当小部件树重建时,状态保持不变

范例

类MyController扩展了GetxController{
最终myArgument=''.obs;
@凌驾
void onInit(){
myArgument(Get.arguments['myVariable']作为字符串);
super.onInit();
}
}
类MyView扩展了GetView{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:展开(
child:Center(child:Obx(()=>Text(controller.myArgument())),
),
);
}
}
更新

因为您正在寻找无页面转换的解决方案,所以实现这一点的另一种方法是在控制器中创建函数或直接从UI分配。就像这样

类MyController扩展了GetxController{
final myArgument='empty'。obs;
}
类MyView扩展了GetView{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:展开(
儿童:升降按钮(
onPressed:()=>\u someMethod(上下文),
子对象:Obx(()=>Text(controller.myArgument()),
),
),
);
}
void\u someMethod(BuildContext上下文)异步{
//把它储存在州里。
controller.myArgument(Get.arguments['myVariable']作为字符串);
等待显示对话框(
上下文:上下文,
生成器:(上下文)=>新建AlertDialog(…),
);
print(controller.myArgument());//应该可以
}
}
更新2(如果不使用GetView)

类MyController扩展了GetxController{
final myArgument='empty'。obs;
}
类MyView扩展了无状态小部件{
最终控制器=Get.put(MyController());
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:展开(
儿童:升降按钮(
onPressed:()=>\u someMethod(上下文),
子对象:Obx(()=>Text(controller.myArgument()),
),
),
);
}
void\u someMethod(BuildContext上下文)异步{
//把它储存在州里。
controller.myArgument(Get.arguments['myVariable']作为字符串);
等待显示对话框(
上下文:上下文,
生成器:(上下文)=>新建AlertDialog(…),
);
print(controller.myArgument());//应该可以
}
}
更新3(不推荐)

如果您真的想不惜任何代价避免使用Controller,您可以将其分配给
StatefulWidget
中的一个普通变量,尽管我不推荐这种方法,因为它被认为是不好的做法,违反了框架本身的目标,并且可能会在将来混淆您的团队

类MyPage扩展StatefulWidget{
constmypage({Key?Key}):super(Key:Key);
@凌驾
_MyPageState createState()=>\u MyPageState();
}
类MyPageState扩展了状态{
字符串_myArgument='empty';
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:展开(
儿童:升降按钮(
onPressed:()=>\u someMethod(上下文),
子:文本(_myArgument),
),
),
);
}
void\u someMethod(BuildContext上下文)异步{
//把它储存在州里。
设置状态(){
_myArgument=Get.arguments['myVariable']作为字符串;
});
等待显示对话框(
上下文:上下文,
生成器:(上下文)=>新建AlertDialog(…),
);
print(_myArgument);//这应该可以
}
}

很抱歉格式不正确,我正在用手机写,回家后会尽快更新谢谢你的建议,但我正在寻找一个解决方案,在不进行页面转换的情况下更新Getx参数。我更新了我的答案,请看@CharithJayasanka