我正在用Firebase制作一个Flutter应用程序,我仍然被身份验证卡住了,因为无论我登录还是注册,它都会将我重定向到HomePage()。在我的auth_page.dart类中,我有一个bool showLogin,它在LoginPage和RegisterPage之间切换,我想在我的WidgetTree中访问它,这样当我注册时,它会将我重定向到CreateProfilePage()而不是Home()。
下面是涉及的两个类:
class AuthPage extends StatefulWidget {
AuthPage({super.key});
static bool getShowLogin(BuildContext context) {
final state = context.findAncestorStateOfType<_AuthPageState>();
return state?.showLogin ?? true;
}
@override
State<AuthPage> createState() => _AuthPageState();
}
final _authKey = GlobalKey<_AuthPageState>();
class _AuthPageState extends State<AuthPage> {
// show login page initially
bool showLogin = true;
void toggleScreens() {
setState(() {
showLogin = !showLogin;
});
}
@override
Widget build(BuildContext context) {
if (showLogin) {
return LoginPage(showRegisterPage: toggleScreens,);
}
else {
return RegisterPage(showLoginPage: toggleScreens,);
}
}
}
然后呢
class WidgetTree extends StatefulWidget {
const WidgetTree({Key? key,}) : super(key: key);
@override
State<StatefulWidget> createState() => _WidgetTreeState();
}
class _WidgetTreeState extends State<WidgetTree> {
@override
Widget build(BuildContext context) {
bool isLogin = AuthPage.getShowLogin(context);
return StreamBuilder(
stream: Auth().authStateChanges,
builder: (context, snapshot) {
if (snapshot.hasData) {
return isLogin ? HomePage() : CreateProfilePage();
}
else {
return AuthPage();
}
},
);
}
}
我试着把toggleScreens()直接放在AuthPage中,但是它不再切换页面了
static void toggleScreens(BuildContext context) {
final state = _authKey.currentState;
if (state != null) {
state.setState(() {
state.showLogin = !state.showLogin;
});
}
}
}
我也试过在AuthPage中这样实现getShowLogin(),但当我注册时,它仍然会将我重定向到HomePage():
static bool getShowLogin() {
final state = _authKey.currentState;
return state?.showLogin ?? true;
}
提前感谢您的帮助!!
2条答案
按热度按时间nhaq1z211#
您需要使用一些状态管理并保存
isLogin
状态。您可以自己实现一个,例如ValueNotifier,或者您可以选择使用许多状态管理包解决方案之一,如Riverpod和Bloc,仅举几例。
当然,你可以使用任何一个在那里。
ev7lccsx2#
在代码中,您尝试从父小部件(这里是WidgetTree)访问AuthPage的属性。我不认为上下文会向您发送布尔结果:
因此,要实现您想要的目标,最好使用提供商或集团。
下面是使用提供程序的示例代码:
提供方:
AuthPage
通过使用提供程序,你可以很容易地得到切换屏幕的布尔结果,就像你想要的那样。