dart GoRouter导航不工作,尝试从小部件树外部侦听使用provider公开的值

wgx48brx  于 2023-05-26  发布在  Go
关注(0)|答案(1)|浏览(111)

我正在使用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);
它不受支持,因为当小部件树不关心值时,可能会毫无意义地重新构建与事件处理程序关联的小部件。

az31mfrm

az31mfrm1#

很可能是由于

Provider.of<AuthProvider>(context, listen: true);

在路由器的redirect功能中。尝试更改为listen:false

相关问题