로그인 경로로 이동하고 .NET Framework에서 다른 모든 경로를 제거하는 로그 아웃 버튼을 개발하고 싶습니다 Navigator
. 문서는 만드는 방법을 설명하지 않거나 RoutePredicate
일종의 removeAll 함수를 갖는 것 같습니다 .
답변
다음 코드로이 작업을 수행 할 수있었습니다.
Navigator.of(context)
.pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
여기서 비밀은 항상 false를 반환하는 RoutePredicate를 사용하는 것입니다 (Route<dynamic> route) => false
. 이 상황에서는 /login
내가 푸시 한 새 경로를 제외한 모든 경로가 제거됩니다 .
답변
다음 코드 스 니펫으로 수행 할 수 있습니다.
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
LoginScreen()), (Route<dynamic> route) => false),
푸시 된 경로 아래의 모든 경로를 제거하려면 RoutePredicate는 항상 false를 반환 합니다 ( 예 : (Route route) => false) .
답변
또 다른 대안은 popUntil()
Navigator.of(context).popUntil(ModalRoute.withName('/root'));
이렇게하면 명명 된 경로로 돌아올 때까지 모든 경로가 표시됩니다.
답변
또 다른 해결책은 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
);
함께 홈페이지 경로입니다 당신이 위젯의 이름을 확인합니다.
답변
namedRoutes를 사용하는 경우 다음과 같이 간단히 수행 할 수 있습니다.
Navigator.pushNamedAndRemoveUntil(context, "/login", (Route<dynamic> route) => false);
여기서 “/ login” 은 경로 스택에 푸시하려는 경로입니다.
참고 :
이 문은 스택의 모든 경로를 제거하고 푸시 된 경로를 루트로 만듭니다.
답변
아무도 SchedularBindingInstance를 사용하여 솔루션을 언급하지 않은 이유를 모르겠습니다. 하지만 파티에 조금 늦었지만 이것이 원래 여기에서 대답 한 올바른 방법이라고 생각합니다 .
SchedulerBinding.instance.addPostFrameCallback((_) async {
Navigator.of(context).pushNamedAndRemoveUntil(
'/login',
(Route<dynamic> route) => false);
});
위의 코드는 ‘/ login’에 대한 모든 경로와 탐색을 제거합니다. 이것은 또한 콜백을 예약하여 새 경로로 이동하기 전에 모든 프레임이 렌더링되도록합니다.