根据这个博客,如果使用Navigator 2.0和/或(在我的情况下)GoRouter,你不能再使用"WillPopScope"覆盖手机的返回按钮。和onWillPop函数调用。Navigator 2.0现在使用PopRoute返回。
这会导致在颤振页面上使用webview时出现问题。如果用户在网页视图中导航到另一个网页,然后点击手机上的返回按钮,他们自然会期望网页视图导航到上一个网页。但相反,它会将用户从该页面带回到他们之前的flutter页面。
有别的办法吗?我可以让我的后退按钮先检查是否有一个控制器。cangoback(),就像我以前能够做旧的导航系统?
我找到了一个解决方案。复杂,但功能:
我必须创建一个自定义的backbuttondispatcher;把它加到主菜单中。飞镖MaterialApp。路由器功能
child: Builder(builder: (BuildContext context) {
final router = Provider.of<MainRouter>(context, listen: false).router;
backbuttondispatcher = backButtonDispatcher(router.routerDelegate, settings);
return MaterialApp.router(
routeInformationParser: router.routeInformationParser,
routeInformationProvider: router.routeInformationProvider,
routerDelegate: router.routerDelegate,
backButtonDispatcher: backbuttondispatcher,
.
.
.
我在router文件夹中创建了新的dispatcher,并命名为"backbuttondispatcher.dart.
import 'package:flutter/material.dart';
class backButtonDispatcher extends RootBackButtonDispatcher {
final RouterDelegate _routerDelegate;
final _settings;
backButtonDispatcher(this._routerDelegate,this._settings)
: super();
Future<bool> didPopRoute() async {
//Can user leave the page?
if (!_settings.canLeavePage) {
//no, as the webview widget has flagged canLeavePage as false
_settings.goBackToPreviousWebsite();
return true;
}else{
//yes, perform standard popRoute call
return _routerDelegate.popRoute();
}
}
}
使用共享类引用(我使用"_settings")我存储了一个标志,表示用户是否遍历了多个网页-如果为TRUE,返回按钮调度程序将不会返回到以前的路由/页面,而是调用另一个函数(指针)来处理返回到webview小部件路由中的上一个网页。但如果为FALSE,调度程序执行它的标准didPopRoute函数。
此外,在所有其他带有webview的路由/页面上,指针函数和布尔值需要重置为null和false。这并不理想,但幸运的是,应用程序中没有那么多页面。
让我恼火的是,他们改变了主路线/页面导航的后退按钮功能,但没有考虑到后退按钮也可以用于返回到上一个网页的事实。我明白我们不应该在网页上显示应用程序,但我们这些低级开发人员并不总是有权力拒绝上级的应用程序要求。