Flutter 在颤振中使用showDialog()后,Getx参数被清除
执行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
_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