在 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 参数的主要内容,如果未能解决你的问题,请参考以下文章

Flutter中showDialog()后关闭Dialog

在showDialog中Flutter Navigator.of(context).pop(),在ios中关闭整个应用程序

Flutter showDialog 如何刷新 setStatus

flutter 改变数据,showDialog对话框内的UI不更新

如何在 Flutter 中处理这个 Text 小部件?

Flutter 创建自己的对话框,不使用任何包!