0

The used Getx Arguments are cleared after the showDialog method is executed.

    _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

Also I would like to know how to use Getx to show snackbars without losing the previous arguments as above.

Charith Jayasanka
  • 4,033
  • 31
  • 42

1 Answers1

0

One way to do this is to duplicate the data into a variable inside the controller and make a use from it instead of directly using it from the Get.arguments, so when the widget tree rebuild, the state are kept.

Example

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()))),
      ),
    );
  }
}

UPDATE

Since you are looking for solution without page transition, another way to achieve that is to make a function in the Controller or directly assign in from the UI. Like so...

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
  }
}

UPDATE 2 (If you don't use 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
  }
}

UPDATE 3 (NOT RECOMMENDED)

If you really really really want to avoid using Controller at any cost, you can assign it to a normal variable in a StatefulWidget, although I do not recommend this approach since it was considered bad practice and violates the goal of the framework itself and might confuse your team in the future.

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
  }
}
Yura
  • 1,937
  • 2
  • 19
  • 47