我有一个屏幕,如果提供的布尔值(isLoggedIn)更改为true,我想从该屏幕导航到新屏幕。 下面的第一个构建方法是不可能的,因为在构建过程中无法调用Navigator。我尝试在构建中执行此操作,因为我需要访问上下文才能使用我的提供程序。来自授权提供者的isLoggedIn的值可以随时更改,因此我必须检查一下。
如何使用提供程序和导航器解决此问题?
//Not working solution
Widget build(BuildContext context) {
Authorization auth = Provider.of<Authorization>(context);
return Scaffold(
body: Center(
child: auth.isLoggedIn
? Text(
"Logged In",
)
: Navigator.pushReplacementNamed(context, 'sign-in')),
);
}
我可以在没有导航器的情况下做到这一点:
//Working solution
class SplashScreen extends StatelessWidget {
static const routeName = 'splash';
@override
Widget build(BuildContext context) {
final auth = Provider.of<Authorization>(context);
return auth.isLoggedIn ? HomeScreen() : SignInScreen();
}
}
但是我现在不是一个可靠的方法。
答案 0 :(得分:1)
这是解决问题的一种方法。
enum AuthStatus {
NOT_DETERMINED,
NOT_LOGGED_IN,
LOGGED_IN,
}//Always define this outside the class.
AuthStatus authStatus = AuthStatus.NOT_DETERMINED;
@override
void initState() {
super.initState();
getCurrentUser().then((user) {
setState(() {
if (user != null) {
_userId = user?.uid;
}
authStatus =
user?.uid == null ? AuthStatus.NOT_LOGGED_IN : AuthStatus.LOGGED_IN;
});
});
}
Future<FirebaseUser> getCurrentUser() async {
FirebaseUser user = await _firebaseAuth.currentUser();
return user;
}
void loginCallback() {
getCurrentUser().then((user) {
setState(() {
_userId = user.uid.toString();
authStatus = AuthStatus.LOGGED_IN;
Navigator.of(context).pushReplacementNamed('/');
});
});
}
Widget buildWaitingScreen() {
return Scaffold(
body: Container(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
child: CircleAvatar(
backgroundColor: Colors.transparent,
radius: 70.0,
child: Image.asset('assets/icons/icon.png'),
),
),
);
}
@override
Widget build(BuildContext context) {
switch (authStatus) {
case AuthStatus.NOT_DETERMINED:
return buildWaitingScreen();
break;
case AuthStatus.NOT_LOGGED_IN:
return new LoginSignUpPage();
break;
case AuthStatus.LOGGED_IN:
if (_userId.length > 0 && _userId != null) {
return new HomePage();
} else
return buildWaitingScreen();
break;
default:
return buildWaitingScreen();
}
}
}
要进行导航,请在initState中使用它
void loginCallback() {
getCurrentUser().then((user) {
setState(() {
_userId = user.uid.toString();
authStatus = AuthStatus.LOGGED_IN;
});});
if(authStatus==AuthStatus.LOGGED_IN){
Navigator.pushReplacementNamed(context, 'sign-in')} }