Saya ingin mengembangkan tombol logout yang akan mengirim saya ke rute masuk dan menghapus semua rute lain dari Navigator
. Dokumentasi tampaknya tidak menjelaskan cara membuat RoutePredicate
atau memiliki fungsi removeAll apa pun.
98
saya dapat melakukannya dengan potongan kode berikut:
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) => LoginScreen()), (Route<dynamic> route) => false),
jika Anda ingin menghapus semua rute di bawah rute yang didorong, RoutePredicate selalu mengembalikan false , misalnya (Route route) => false .
sumber
Alternatif lainnya adalah
popUntil()
Navigator.of(context).popUntil(ModalRoute.withName('/root'));
Ini akan menghentikan semua rute sampai Anda kembali ke rute yang ditentukan.
sumber
Solusi lain adalah dengan menggunakan
pushAndRemoveUnit()
. Untuk menghapus semua rute lainnya, gunakanModalRoute.withName('/')
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (BuildContext context) => Login()), ModalRoute.withName('/'));
Referensi: https://api.flutter.dev/flutter/widgets/NavigatorState/pushAndRemoveUntil.html
sumber
Jika Anda ingin kembali ke layar tertentu dan Anda tidak menggunakan router bernama dapat menggunakan pendekatan selanjutnya
Contoh:
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (BuildContext context) => SingleShowPage()), (Route<dynamic> route) => route is HomePage );
Dengan rute adalah HomePage Anda memeriksa nama widget Anda.
sumber
Jika Anda menggunakan namesRoutes, Anda dapat melakukannya dengan:
Navigator.pushNamedAndRemoveUntil(context, "/login", (Route<dynamic> route) => false);
Di mana "/ login" adalah rute yang ingin Anda dorong di tumpukan rute.
Perhatikan Bahwa:
sumber
Saya tidak tahu mengapa tidak ada yang menyebutkan solusi menggunakan SchedularBindingInstance , Agak terlambat ke pesta, saya pikir ini akan menjadi cara yang tepat untuk melakukannya awalnya dijawab di sini
SchedulerBinding.instance.addPostFrameCallback((_) async { Navigator.of(context).pushNamedAndRemoveUntil( '/login', (Route<dynamic> route) => false); });
Kode di atas menghapus semua rute dan navigasi ke '/ login' ini juga memastikan bahwa semua frame dirender sebelum menavigasi ke rute baru dengan menjadwalkan panggilan balik
sumber
Ini bekerja untuk saya. Sebenarnya, saya bekerja dengan blok tetapi masalah saya adalah blok layar masuk. Itu tidak diperbarui setelah logout. Itu memegang data model sebelumnya. Bahkan, saya memasukkan entri yang salah. Itu akan ke Layar Beranda.
Langkah 1:
Navigator.of(context).pushNamedAndRemoveUntil( UIData.initialRoute, (Route<dynamic> route) => false);
dimana,
UIData.initialRoute = "/" or "/login"
Langkah 2:
Ini berfungsi untuk menyegarkan layar. Jika Anda bekerja dengan Bloc maka itu akan sangat membantu.
dimana,
MyApp() is the root class.
Kode kelas root (yaitu MyApp)
class MyApp extends StatelessWidget { final materialApp = Provider( child: MaterialApp( title: UIData.appName, theme: ThemeData(accentColor: UIColor().getAppbarColor(), fontFamily: UIData.quickFont, ), debugShowCheckedModeBanner: false, //home: SplashScreen(), initialRoute: UIData.initialRoute, routes: { UIData.initialRoute: (context) => SplashScreen(), UIData.loginRoute: (context) => LoginScreen(), UIData.homeRoute: (context) => HomeScreen(), }, onUnknownRoute: (RouteSettings rs) => new MaterialPageRoute( builder: (context) => new NotFoundPage( appTitle: UIData.coming_soon, icon: FontAwesomeIcons.solidSmile, title: UIData.coming_soon, message: "Under Development", iconColor: Colors.green, ) ))); @override Widget build(BuildContext context) { return materialApp; } } void main() => runApp(MyApp());
Berikut adalah metode Logout Saya ,
void logout() async { SharedPreferences preferences = await SharedPreferences.getInstance(); preferences.clear(); // TODO: we can use UIData.loginRoute instead of UIData.initialRoute Navigator.of(context).pushNamedAndRemoveUntil( UIData.initialRoute, (Route<dynamic> route) => false); //TODO: It's working as refresh the screen runApp(MyApp()); }
sumber
Tidak yakin apakah saya melakukan ini dengan benar
tapi ini sesuai dengan kasus penggunaan saya untuk popping sampai dengan widget root
void popUntilRoot({Object result}) { if (Navigator.of(context).canPop()) { pop(); popUntilRoot(); } }
sumber
to clear route - onTap: () { //todo to clear route - Navigator.of(context).pop(); Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateEmployeeUpdateDateActivity(_token),)); widget.listener.onEmployeeDateClick(_day,_month, _year); }
sumber