로그인 경로로 이동하고 .NET Framework에서 다른 모든 경로를 제거하는 로그 아웃 버튼을 개발하고 싶습니다 Navigator
. 문서는 만드는 방법을 설명하지 않거나 RoutePredicate
일종의 removeAll 함수를 갖는 것 같습니다 .
로그인 경로로 이동하고 .NET Framework에서 다른 모든 경로를 제거하는 로그 아웃 버튼을 개발하고 싶습니다 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'에 대한 모든 경로와 탐색을 제거합니다. 이것은 또한 콜백을 예약하여 새 경로로 이동하기 전에 모든 프레임이 렌더링되도록합니다.
이것은 나를 위해 일하고 있습니다. 사실 저는 bloc 과 함께 일하고 있었지만 제 문제는 로그인 화면 블록이었습니다. 로그 아웃 후 업데이트되지 않았습니다. 이전 모델 데이터를 보유하고있었습니다. 그래도 잘못된 항목을 입력했는데 홈 화면으로 이동했습니다.
1 단계:
Navigator.of(context).pushNamedAndRemoveUntil(
UIData.initialRoute, (Route<dynamic> route) => false);
어디,
UIData.initialRoute = "/" or "/login"
2 단계:
화면을 새로 고침하는 중입니다. Bloc과 함께 일한다면 매우 도움이 될 것입니다.
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());
}