В этом случае я хочу добавить willpopscope в свое приложение, и я обнаружил, что иногда оно не может корректно всплыть, поэтому я отладил код и обнаружил, что наблюдатель наблюдает событие pu sh при открытии диалога, я думаю, что странно.
Это мой наблюдатель
class MyNavigatorObserver extends NavigatorObserver {
List<Route<dynamic>> routeStack = List();
void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
previous = previousRoute;
current = route;
routeStack?.add(route);
print('didPush');
print(routeStack.length);
print(routeStack.sublist(0));
}
void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {
if (routeStack.length > 0) {
routeStack?.removeLast();
print('didPop');
print(routeStack.length);
print(routeStack.sublist(0));
}
}
@override
void didRemove(Route route, Route previousRoute) {
routeStack?.removeLast();
}
@override
void didReplace({Route newRoute, Route oldRoute}) {
routeStack?.removeLast();
routeStack?.add(newRoute);
}
}
, и я использую его на главном классе страницы приложения
WillPopScope(
...
child: Navigator(
observers: [MyNavigatorObserver],
key: _navigator,
onGenerateRoute: (RouteSettings settings) {
...
}
...
if (page.parentRoute != null) {
return MaterialPageRoute(
...
);
} else {
NaviArguments arg = settings.arguments;
return PageRouteBuilder(
...
);
}
},
),
),
и когда я запускаю действие, чтобы показать dialog
void showProfileChildView(
BuildContext context, {
ProfileChildBuilder child,
ProfileViewState state,
}) {
showGeneralDialog(
context: context,
barrierDismissible: false,
transitionDuration: Duration(milliseconds: 150),
pageBuilder: (BuildContext context, Animation<double> animation, _) {
var scaleAnimation = Tween(
begin: Offset(0.0, 1.0),
end: Offset(0.0, 0.0),
).chain(CurveTween(curve: Curves.easeOutExpo)).animate(animation);
return SlideTransition(
position: scaleAnimation,
child: ProfileChildView(
child: child,
profileViewState: state,
),
);
},
useRootNavigator: false,
);
}
распечатывает это
I/flutter (25147): didPush
I/flutter (25147): 1
I/flutter (25147): [_DialogRoute<dynamic>(RouteSettings("null", null), animation: AnimationController#48fc4(▶ 0.000; for _DialogRoute<dynamic>))]
В других случаях, когда я запускаю другое диалоговое окно (не на всю страницу), оно не вызывает событие pu sh потому что один на всю страницу один не на всю страницу? может кто-нибудь сказать мне, почему?