在 Flutter 中使用 showDialog() 后清除 Getx 参数
Posted
技术标签:
【中文标题】在 Flutter 中使用 showDialog() 后清除 Getx 参数【英文标题】:Getx argumentsbeing cleared after using showDialog() in Flutter 【发布时间】:2021-05-29 14:03:37 【问题描述】:在 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 来显示小吃吧,而不会丢失上面的参数。
【问题讨论】:
【参考方案1】:执行此操作的一种方法是将数据复制到控制器内的变量中并从中使用,而不是直接从Get.arguments
中使用它,因此当小部件树重建时,状态会被保留。
例子
class MyController extends GetxController
final myArgument = ''.obs;
@override
void onInit()
myArgument(Get.arguments['myVariable'] as String);
super.onInit();
class MyView extends GetView<MyController>
@override
Widget build(BuildContext context)
return Scaffold(
body: Expanded(
child: Center(child: Obx(() => Text(controller.myArgument()))),
),
);
更新
由于您正在寻找没有页面转换的解决方案,另一种实现方式是在 Controller 中创建一个功能或直接从 UI 分配。就这样……
class MyController extends GetxController
final myArgument = 'empty'.obs;
class MyView extends GetView<MyController>
@override
Widget build(BuildContext context)
return Scaffold(
body: Expanded(
child: ElevatedButton(
onPressed: () => _someMethod(context),
child: Obx(() => Text(controller.myArgument())),
),
),
);
void _someMethod(BuildContext context) async
// store it in the state.
controller.myArgument(Get.arguments['myVariable'] as String);
await showDialog(
context: context,
builder: (context) => new AlertDialog(...),
);
print(controller.myArgument()); // This should work
更新 2(如果您不使用 GetView)
class MyController extends GetxController
final myArgument = 'empty'.obs;
class MyView extends StatelessWidget
final controller = Get.put(MyController());
@override
Widget build(BuildContext context)
return Scaffold(
body: Expanded(
child: ElevatedButton(
onPressed: () => _someMethod(context),
child: Obx(() => Text(controller.myArgument())),
),
),
);
void _someMethod(BuildContext context) async
// store it in the state.
controller.myArgument(Get.arguments['myVariable'] as String);
await showDialog(
context: context,
builder: (context) => new AlertDialog(...),
);
print(controller.myArgument()); // This should work
更新 3(不推荐)
如果您真的真的很想不惜一切代价避免使用控制器,您可以将它分配给StatefulWidget
中的普通变量,尽管我不推荐这种方法,因为它被认为是不好的实践并违反框架本身的目标,并可能在未来让您的团队感到困惑。
class MyPage extends StatefulWidget
const MyPage( Key? key ) : super(key: key);
@override
_MyPageState createState() => _MyPageState();
class _MyPageState extends State<MyPage>
String _myArgument = 'empty';
@override
Widget build(BuildContext context)
return Scaffold(
body: Expanded(
child: ElevatedButton(
onPressed: () => _someMethod(context),
child: Text(_myArgument),
),
),
);
void _someMethod(BuildContext context) async
// store it in the state.
setState(()
_myArgument = Get.arguments['myVariable'] as String;
);
await showDialog(
context: context,
builder: (context) => new AlertDialog(...),
);
print(_myArgument); // This should work
【讨论】:
抱歉格式错误,我是用手机写的,回家后会尽快更新 感谢您的建议,但我正在寻找一种无需页面转换即可更新 Getx 参数的解决方案。 我更新了我的答案,请看看@CharithJayasanka以上是关于在 Flutter 中使用 showDialog() 后清除 Getx 参数的主要内容,如果未能解决你的问题,请参考以下文章
在showDialog中Flutter Navigator.of(context).pop(),在ios中关闭整个应用程序
Flutter showDialog 如何刷新 setStatus