【问题标题】:Flutter Cubit With BlocListener: How can I Navigate the user according to state?Flutter Cubit With BlocListener:如何根据状态导航用户?
【发布时间】:2022-02-04 11:11:32
【问题描述】:

我有一个基本的auth cubit,在状态下,它只有一个变量。

@freezed
class AuthState with _$AuthState {
  const AuthState._();

  const factory AuthState({
    required bool isUserSignedIn,
  }) = _AuthState;

  factory AuthState.initial() => const AuthState(isUserSignedIn: false);
}

在 cubit 部分,我可以通过调试控制台中的FirebaseAuth.instance.authStateChanges().listen((User? user)) 方法轻松检查用户是否登录。

现在,问题从着陆页部分开始。有些事情会造成问题。

首先,您可以在下面看到着陆页代码。在这里,我有 initState 作为初始值(当 App 启动时,它首先工作),然后,我返回 BlocListener 来监听 cubit 的状态。 当我单击登录按钮和注销按钮时,它可以正常工作(我可以在调试控制台中看到它,我可以注销但相同的屏幕继续停留,在我重新加载应用程序后,我可以看到我有已退出)。

在 BlocListener 部分,我尝试打印一些文本,但它们不起作用,我的意思是我在调试控制台中看不到它们。

class LandingPage extends StatefulWidget {
  const LandingPage({Key? key}) : super(key: key);

  @override
  State<LandingPage> createState() => _LandingPageState();
}

class _LandingPageState extends State<LandingPage> {
  @override
  void initState() {
    WidgetsBinding.instance!.addPostFrameCallback((_) {
      final bool isUserSignedIn =
          context.read<AuthCubit>().state.isUserSignedIn;
      if (isUserSignedIn) {
        AutoRouter.of(context).replace(const HomeRoute());
      } else if (!isUserSignedIn) {
        AutoRouter.of(context).replace(const SignInRoute());
      }
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return BlocListener<AuthCubit, AuthState>(
      listenWhen: (p, c) => p.isUserSignedIn != c.isUserSignedIn,
      listener: (context, state) {
        final bool isUserSignedIn =
            context.read<AuthCubit>().state.isUserSignedIn;

        if (isUserSignedIn) {
          print("blocblocbloc1");
          AutoRouter.of(context).replace(const HomeRoute());
        } else {
          print("blocblocbloc2");
          AutoRouter.of(context).root.popUntilRoot();
        }
      },
      child: const Scaffold(
        body: Center(
          child: CircularProgressIndicator(color: Colors.white),
        ),
      ),
    );
  }
}

除此之外,我使用自动路由进行轮换(因为我不想看到直接的小部件,所以我想根据用户的登录状态导航)。首先我想也许 AutoRouter 不起作用,但是 print 语句也不起作用。

这里我也分享一下我的 main.dart 文件。

class AppWidget extends StatelessWidget {
  const AppWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final _appRouter = AppRouter();
    return BlocProvider(
      lazy: true,
      create: (context) => AuthCubit(),
      child: MaterialApp.router(
        routeInformationParser: _appRouter.defaultRouteParser(),
        routerDelegate: _appRouter.delegate(),
        debugShowCheckedModeBanner: false,
      ),
    );
  }
}

最后,我的路由器页面在这里。

@MaterialAutoRouter(
  replaceInRouteName: 'Page,Route',
  routes: <AutoRoute>[
    AutoRoute(page: LandingPage, initial: true),
    AutoRoute(
      page: HomePage,
    ),
    AutoRoute(
      page: SignInPage,
    ),
  ],
)
class $AppRouter {}

【问题讨论】:

    标签: flutter firebase-authentication navigation bloc


    【解决方案1】:

    解决方案:使用flow_builder根据状态导航用户

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 2022-10-13
      • 2021-12-14
      • 2021-06-20
      • 2021-12-23
      • 2020-12-15
      • 2020-05-06
      • 1970-01-01
      • 2023-01-20
      相关资源
      最近更新 更多