getx
getx copied to clipboard
GetX 5 version. Get.closeOverlay() remove route like Get.back()
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.