【问题标题】:Getx argumentsbeing cleared after using showDialog() in Flutter在 Flutter 中使用 showDialog() 后清除 Getx 参数
【发布时间】: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 来显示小吃吧,而不会丢失上面的参数。

【问题讨论】:

    标签: flutter dart flutter-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
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2021-07-04
    • 2022-10-21
    • 2022-07-17
    • 2022-08-04
    • 2022-01-06
    • 2022-07-01
    • 2022-12-01
    相关资源
    最近更新 更多