getx icon indicating copy to clipboard operation
getx copied to clipboard

GetX 5 version. Get.closeOverlay() remove route like Get.back()

Open Auramel opened this issue 9 months ago • 0 comments
trafficstars

Hello, I had the problem after migrate to GetX 5.

Get.closeOverlay() close current route, not my bottomSheet. I need to close only bottomSheet. I noticed that if I add small delay (like 1 second), it solved the problem.

Scheme: Home -> Second -> Open Bottom Sheet -> Third -> Get.back(). GetX close Third and Second.

logs:

[GETX] GetDelegate is created !
[GETX] GetInformationParser is created !
[GETX] GetInformationParser: route location: /home
[GETX] GOING TO ROUTE /home
[GETX] Instance "HomeController" has been created
[GETX] Instance "HomeController" has been initialized
[GETX] GOING TO ROUTE /second
[GETX] Instance "SecondController" has been created
[GETX] Instance "SecondController" has been initialized
[GETX] GOING TO ROUTE /third
[GETX] Instance "ThirdController" has been created
[GETX] Instance "ThirdController" has been initialized
[GETX] CLOSE TO ROUTE /third
[GETX] REMOVING ROUTE null
[GETX] PREVIOUS ROUTE /home
[GETX] REMOVING ROUTE /second
[GETX] PREVIOUS ROUTE /home
[GETX] "ThirdController" onDelete() called
[GETX] "SecondController" onDelete() called

Code to reproduce this:

import 'package:flutter/material.dart';
import 'package:get/get.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Flutter Demo',
      initialRoute: '/home',
      getPages: [
        GetPage(
          name: '/home',
          page: () => HomeScreen(),
          binds: [
            Bind.lazyPut<HomeController>(() => HomeController(), fenix: true),
          ],
        ),
        GetPage(
          name: '/second',
          page: () => SecondScreen(),
          binds: [
            Bind.lazyPut<SecondController>(() => SecondController(), fenix: true),
          ],
        ),
        GetPage(
          name: '/third',
          page: () => ThirdScreen(),
          binds: [
            Bind.lazyPut<ThirdController>(() => ThirdController(), fenix: true),
          ],
        ),
      ],
    );
  }
}

class HomeController extends GetxController {
  void onButtonClicked() {
    Get.toNamed('/second');
  }
}
class HomeScreen extends StatelessWidget {
  final HomeController controller = Get.find();

  HomeScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return GetBuilder(
      init: controller,
      builder: (_) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('First'),
          ),
          body: SafeArea(
            child: Center(
              child: MaterialButton(
                onPressed: controller.onButtonClicked,
                color: Colors.red,
                child: const Text('Go to second'),
              ),
            ),
          ),
        );
      },
    );
  }
}

class SecondController extends GetxController {
  Future<void> onButtonClicked() async {
    showModalBottomSheet(
      context: Get.context!,
      builder: (_) {
        return Center(
          child: MaterialButton(
            color: Colors.blue,
            onPressed: _onBottomSheetButtonClicked,
            child: Text('go to third'),
          ),
        );
      }
    );
  }

  Future<void> _onBottomSheetButtonClicked() async {
    await Get.toNamed('/third');
    
    // uncomment this, and it solved the problem
    // await Future.delayed(const Duration(seconds: 1));
    
    Get.closeOverlay();
  }
}
class SecondScreen extends StatelessWidget {
  final SecondController controller = Get.find();

  SecondScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return GetBuilder(
      init: controller,
      builder: (_) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('Second'),
            leading: const SizedBox.shrink(),
          ),
          body: SafeArea(
            child: Center(
              child: MaterialButton(
                onPressed: controller.onButtonClicked,
                color: Colors.red,
                child: const Text('Open bottom sheet'),
              ),
            ),
          ),
        );
      },
    );
  }
}

class ThirdController extends GetxController {}
class ThirdScreen extends StatelessWidget {
  final ThirdController controller = Get.find();

  ThirdScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return GetBuilder(
      init: controller,
      builder: (_) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('Third'),
            leading: const SizedBox.shrink(),
          ),
          body: SafeArea(
            child: Center(
              child: MaterialButton(
                onPressed: Get.back,
                color: Colors.red,
                child: const Text('Go back'),
              ),
            ),
          ),
        );
      },
    );
  }
}

Please, tell me how to fix it. Thanks.

Auramel avatar Feb 20 '25 15:02 Auramel