我正在使用GoRouter导航我的应用程序。但我遇到了以下错误:当我尝试导航到ProfilePage时,什么也没有发生。甚至没有错误消息。看了文档后,我似乎已经做了所有的权利,但为什么不为我打开所需的页面点击?谁知道会出什么问题?
route_utils
extension AppPageExtenstion on AppPage {
String get toPath {
switch (this) {
case AppPage.home:
return '/';
case AppPage.profile:
return '/profile';
default:
return '/';
}
}
String get toName {
switch (this) {
case AppPage.home:
return 'Home';
case AppPage.profile:
return 'Profile';
default:
return 'Home';
}
}
String get toTitle {
switch (this) {
case AppPage.home:
return 'My App';
case AppPage.profile:
return 'My App Profile';
default:
return 'My App';
}
}
}
app_router
class AppRouter {
late final AuthProvider appService;
GoRouter get router => _goRouter;
AppRouter(this.appService);
late final GoRouter _goRouter = GoRouter(
refreshListenable: appService,
initialLocation: AppPage.home.toPath,
routes: <GoRoute>[
GoRoute(
path: AppPage.splash.toPath,
name: AppPage.splash.toName,
builder: (context, state) => const SplashPage(),
),
GoRoute(
path: AppPage.home.toPath,
name: AppPage.home.toName,
builder: (context, state) => const HomePage(),
),
GoRoute(
path: AppPage.profile.toPath,
name: AppPage.profile.toName,
builder: (context, state) => const ProfilePage(),
),
],
errorBuilder: (context, state) => ErrorPage(error: state.error.toString()),
redirect: (context, state) {
final AuthProvider appState =
Provider.of<AuthProvider>(context, listen: true);
final homeLocation = AppPage.home.toPath;
final splashLocation = AppPage.splash.toPath;
switch (appState.loggedInState) {
case LoggedInState.loading:
return splashLocation;
case LoggedInState.loggedIn:
return homeLocation;
}
},
);
}
主要
@override
void initState() {
_appState.checkUser();
super.initState();
}
@override
Widget build(BuildContext context) {
final GoRouter goRouter =
Provider.of<AppRouter>(context, listen: false).router;
return ChangeNotifierProvider<AuthProvider>.value(
value: _appState,
child: MaterialApp.router(
debugShowCheckedModeBanner: false,
title: 'Test App',
routeInformationParser: goRouter.routeInformationParser,
routerDelegate: goRouter.routerDelegate,
),
);
}
ui
drawer: Drawer(
child: ListView(
children: [
ListTile(
title: const Text('Profile'),
onTap: () async {
Provider.of<AuthProvider>(context, listen: false);
GoRouter.of(context).push(AppPage.profile.toPath);
Navigator.pop(context);
},
),
],
),
),
错误
_AssertionError('package:provider/src/provider. dart':Assert失败:第274行位置7:'context.owner!.debugBuilding|| listen == false|| debugIsInInInheritedProviderUpdate':已尝试从小部件树外部侦听使用提供程序公开的值。
这可能是由调用Provider.of而没有传递listen: false
的事件处理程序(如按钮的onPressed)引起的。
要修复,请写入:Provider.of(context,listen:false);
它不受支持,因为当小部件树不关心值时,可能会毫无意义地重新构建与事件处理程序关联的小部件。
1条答案
按热度按时间az31mfrm1#
很可能是由于
在路由器的
redirect
功能中。尝试更改为listen:false