ログインルートに移動し、から他のすべてのルートを削除するログアウトボタンを開発したいと思いますNavigator
。ドキュメントには、RoutePredicate
または任意の種類のremoveAll関数の作成方法が説明されていないようです。
回答:
私は次のコードでこれを達成することができました:
Navigator.of(context)
.pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
ここでの秘密は、常にfalseを返すRoutePredicateを使用すること(Route<dynamic> route) => false
です。この状況では、/login
プッシュした新しいルートを除くすべてのルートが削除されます。
別の解決策は、を使用することpushAndRemoveUntil()
です。他のすべてのルートを削除するには、ModalRoute.withName('/')
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (BuildContext context) => Login()),
ModalRoute.withName('/')
);
参照:https://api.flutter.dev/flutter/widgets/NavigatorState/pushAndRemoveUntil.html
特定の画面に戻りたいが、名前付きルーターを使用しない場合は、次のアプローチを使用できます
例:
Navigator.pushAndRemoveUntil(context,
MaterialPageRoute(builder: (BuildContext context) => SingleShowPage()),
(Route<dynamic> route) => route is HomePage
);
ホームページのルートである、あなたのウィジェットの名前を確認してください。
SchedularBindingInstanceを使用したソリューションについて誰も言及しなかった理由はわかりませんが、パーティーに少し遅れましたが、これが最初にここで回答された正しい方法だと思います
SchedulerBinding.instance.addPostFrameCallback((_) async {
Navigator.of(context).pushNamedAndRemoveUntil(
'/login',
(Route<dynamic> route) => false);
});
上記のコードは、「/ login」へのすべてのルートとナビゲーションを削除します。これにより、コールバックをスケジュールして、新しいルートに移動する前にすべてのフレームがレンダリングされるようになります。
これは私のために働いています。実際、私はブロックで作業していましたが、私の問題はログイン画面のブロックでした。ログアウト後に更新されませんでした。以前のモデルデータを保持していました。でも、間違ったエントリを入力しましたホーム画面に行きました。
ステップ1:
Navigator.of(context).pushNamedAndRemoveUntil(
UIData.initialRoute, (Route<dynamic> route) => false);
どこ、
UIData.initialRoute = "/" or "/login"
ステップ2:
画面の更新に取り組んでいます。あなたがブロックで働いているなら、それは非常に役に立ちます。
runApp(MyApp());
どこ、
MyApp() is the root class.
ルートクラス(つまり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());
これがマイログアウト方法です。
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());
}