根据提供的值更改UI

时间:2020-09-23 14:42:34

标签: flutter flutter-provider flutter-navigation

我有一个屏幕,如果提供的布尔值(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();
  }
}

但是我现在不是一个可靠的方法。

1 个答案:

答案 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')} }