状态改变时AutoRoute不会改变

问题描述 投票:0回答:1

对于路由,我使用

auto_route
并添加了通过提供程序监听更改
reevaluateListenable: authProvider
但是当我的提供程序值更改时,没有任何反应,为什么监听更改不起作用并且它们不打开另一个页面?

主要

Widget build(BuildContext context) {
    return Consumer<AuthProvider>(
      builder: (context, authProvider, child) {
        return MaterialApp.router(
          theme: darkTheme,
          routerConfig: _appRouter.config(
            reevaluateListenable: authProvider,
            navigatorObservers: () => [
              TalkerRouteObserver(
                GetIt.I<Talker>(),
              ),
            ],
          ),
          title: 'Flutter Demo',
        );
      },
    );
  }

authguard

class AuthGuard extends AutoRouteGuard {
  @override
  void onNavigation(NavigationResolver resolver, StackRouter router) async {
    final AuthProvider appState = AuthProvider();

    if (appState.isLoggedIn) {
      resolver.next(true);
    } else {
      resolver.redirect(const AuthRoute());
    }
  }
}

身份验证提供者

class AuthProvider extends ChangeNotifier implements Listenable {
  bool _isLoggedIn = false;

  bool get isLoggedIn => _isLoggedIn;

  void login() {
    _isLoggedIn = true;
    notifyListeners();
  }

  void logout() {
    _isLoggedIn = false;
    notifyListeners();
  }
}

登录屏幕

void onPressedMethod(bool isRegister) {
    final authProvider = Provider.of<AuthProvider>(context, listen: false);
    if (isRegister) {
      authProvider.login();
    } else {
      authProvider.login();
    }
  }
flutter dart provider auto-route
1个回答
0
投票

这里有一些引起我注意的事情

1.AuthGuard 正在其 onNavigation 方法中创建一个新的 AuthProvider 实例,该实例未连接到正在侦听的实例。 通过在防护中使用 Provider.of(context) 访问现有的 AuthProvider 实例来修复它。

2.在

onPressedMethod
中,您使用的是
Provider.of(context, listen: false)
,它会忽略更改。 删除
listen: false
参数以确保监听和重建。

void onNavigation(NavigationResolver resolver, StackRouter router) async {
    final authProvider = Provider.of<AuthProvider>(context); // access instance like you did inside onPressed 

    if (authProvider.isLoggedIn) {
      resolver.next(true);
    } else {
      resolver.redirect(const AuthRoute());
    }
  }

void onPressedMethod(bool isRegister) {
    final authProvider = Provider.of<AuthProvider>(context); // Listen for changes by removing listen : false
    if (isRegister) {
      authProvider.login();
    } else {
      authProvider.login(); // why login in both ???
    }
}

还要确保您已在小部件树中的适当级别使用 ChangeNotifierProvider 正确注册了 AuthProvider。

© www.soinside.com 2019 - 2024. All rights reserved.