【发布时间】: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