使提供商重建

时间:2019-11-05 13:56:17

标签: android flutter dart provider

大家好:)

我是一名学生开发人员,并且从3个月以来就一直处于困境... 我无所不在,无所适从。

我的挑战:

每当我从帐户A注销并再次使用帐户B登录时,我都在应用程序中使用StreamProvider。仍然显示帐户A。有时显示为空。而且,如果我想显示已登录帐户的数据,则需要“运行应用程序”(带有绿色的运行按钮,并带有一个表示正在运行的点)。

我正在考虑的问题是它不会在StreamProviders所在的位置重建主线程。

我尝试了很多事情,如果我通过了一个可能是一个想法并且不知道如何使用它的想法,这时我还是不知道。

谢谢您的时间。我真的很感激。

我的main.dart


// build of the MyApp() (stateful widget)

@override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        StreamProvider<FirebaseUser>.value(value: FirebaseAuth.instance.onAuthStateChanged), // user
        StreamProvider<Users>.value(value: dbUsers.streamUser(user != null ? user.uid : "nothing")), // userFromDatabase
        StreamProvider<Homes>.value(value: dbHomes.streamHome(userFromDatabase != null ? userFromDatabase.idHome : "nothing")), // home from user
      ],
      child: MaterialApp(
          // routes of the dynamics links
          routes: <String, WidgetBuilder>{
            '/invite': (context) => RootPage(auth: Auth(), invite: true, idHome: ModalRoute.of(context).settings.arguments,),
            '/message': (context) => RootPage(auth: Auth(), isMessage: true),
          },
          // ____________________________
          home: RootPage(auth: Auth())
      ),
    );
  }

我的RootPage.dart

enum AuthStatus {
  notSignedIn,
  signedIn
}

class _RootPageState extends State<RootPage> {

  AuthStatus _authStatus = AuthStatus.notSignedIn;

  @override
  void initState() {
    super.initState();
    // verify if the user is signed in
    widget.auth.currentUser().then((userId) {
      setState(() {
        _authStatus = userId == null ? AuthStatus.notSignedIn : AuthStatus.signedIn;
      });
    });

  }

  // ** CALLBACKS **
  void _signedIn(){
    setState(() {
      _authStatus = AuthStatus.signedIn;
    });
  }

  void _signedOut(){
    setState(() {
      _authStatus = AuthStatus.notSignedIn;
    });
  }
  // ________________

  @override
  Widget build(BuildContext context) {
    switch(_authStatus){
      case AuthStatus.notSignedIn:
        if(widget.invite != null){
          return RegisterFromInvitePage(
            auth: widget.auth,
            onSignedIn: _signedIn,
            idHome: widget.idHome,
          );
        } else {
          return LoginPage(
            auth: widget.auth,
            onSignedIn: _signedIn,
          );
        }
        break;
      case AuthStatus.signedIn:
        if(widget.isMessage != null){
          return MessagePage(
              auth: widget.auth,
          );
        } else {
          return HomePage(
              auth: widget.auth,
              onSignedOut: _signedOut,
          );
        }
    }

  }

退出页面(设置)

class _SettingsPageState extends State<SettingsPage> {

  void _signOut() async {
    try {
        await widget.auth.signOut();
        widget.onSignedOut();
    } catch (error) {
        print("Sign out error :");
        print(error);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: ReusableWidgets().getAppBar(S.of(context).drawer_settings),
      drawer: DrawerBuild(),
      body: Column(
        children: <Widget>[
          RaisedButton(
            child: Text(S.of(context).sign_out),
            onPressed: (){
              setState(() {
                _signOut();
              });
            },
          )
        ],
      ),
    );
  }

0 个答案:

没有答案