基于 AuthState flutter with riverpod 进行导航

问题描述

我正在尝试根据来自 firebase 的用户身份验证状态进行导航。但是当我尝试这样做时,我没有被导航到 LoginPage 或 HomePage,我被卡在了启动画面上。我需要根据 Riverpod 的身份验证状态进行导航。

我的 AuthStateNotifier 类

@injectable
class AuthStateNotifier extends StateNotifier<AuthStates> {
  AuthStateNotifier(this._authFacade) : super(const AuthStates.initial());

  final IAuthFacade _authFacade;


  Future handleEvents(AuthEvents events) async {
    return events.map(
      authCheckRequested: (event) async {
        final userOption = await _authFacade.getSignedInUser();
        state = userOption.fold(() => const AuthStates.unAuthenticated(),(a) => const AuthStates.authenticated());
      },signedOut: (event) async {
        await _authFacade.signOut();
        state = const AuthStates.unAuthenticated();
      },);
  }
}

我的 AuthEvents 类

@freezed
class AuthEvents with _$AuthEvents {
  const factory AuthEvents.authCheckRequested() = AuthCheckRequested;

  const factory AuthEvents.signedOut() = SignedOut;
}

我的 AuthStates 类

@freezed
class AuthStates with _$AuthStates {
  const factory AuthStates.initial() = Initial;
  const factory AuthStates.authenticated() = Authenticated;
  const factory AuthStates.unAuthenticated() = UnAuthenticated;
}

我的 MaterialApp

class AppWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    context.read(authStateProvider).handleEvents(AuthEvents.authCheckRequested());
    return MaterialApp(
      debugShowCheckedModeBanner: false,theme: ThemeData.light().copyWith(
        primaryColor: primaryColor,inputdecorationTheme: InputdecorationTheme(
          border: OutlineInputBorder(
            borderRadius: BorderRadius.circular(8.0),borderSide: BorderSide(color: primaryColor),),focusedBorder: OutlineInputBorder(
            borderRadius: BorderRadius.circular(8.0),borderSide: BorderSide(color: primaryColor,width: 2),errorMaxLines: 1,title: 'Share Fest',home: SplashScreen(),);
  }
}

我的启动画面

final authStateProvider = StateNotifierProvider<AuthStateNotifier>((ref) {
  return getIt<AuthStateNotifier>();
});

class SplashScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer(
      builder: (context,watch,child) {
        context.read(authStateProvider.state).map(initial: (_) {
          print('init');
        },authenticated: (_) {
          Navigator.push(context,MaterialPageRoute(builder: (context) => HomePage(),));
        },unAuthenticated: (_) {
          Navigator.push(context,MaterialPageRoute(builder: (context) => LoginForm(),));
        });
        return Scaffold(
            body: Container(
              child: Center(
                child: CircularProgressIndicator(),));
      },);
  }
}

为什么我没有被导航到 LoginPageHomePagestatenotifier 返回 AuthEvents.unAuthenticated(),但即使如此我也无法导航。

请给出解决方案。提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)