Flutter - FutureBuilder не перестраивается, когда пользователь входит в Firebase? - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь получить свой currentUser, используя FutureBuilder в моем main.dart файле:

//my auth.dart file
class Auth {
final FirebaseAuth _auth = FirebaseAuth.instance;
Future getUser() {
    return _auth.currentUser();
  }
}


class MyApp extends StatelessWidget {
Auth auth = Auth();
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FutureBuilder(
          future: auth.getUser(),
          builder: (context, AsyncSnapshot snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.error != null) {
                print("$snapshot.error.toString()");
                return Container();
              }
              if (snapshot.hasData) {
                return BottomBar(
                    firebaseUser: snapshot.data, visibleLogin: false);
              } else if (snapshot.data == null) {
                return BottomBar(
                  firebaseUser: null,
                  visibleLogin: true,
                );
              }
            }
            return CircularProgressIndicator();
          }),
    );
  }
}

// Обновление, пробовал использовать StreamBuilder

StreamBuilder<FirebaseUser>(
          stream: FirebaseAuth.instance.onAuthStateChanged,
          builder: (BuildContext context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.data.uid!=null) {
                return BottomBar(
                    firebaseUser: snapshot.data, visibleLogin: false);
              } else {
                return BottomBar(
                  firebaseUser: null,
                  visibleLogin: true,
                );
              }
            }
            return CircularProgressIndicator();
          }),

Каждый раз, когда мой пользователь входит в систему, я передаю пользователя в свою нижнюю панель навигации, которая затем передает данные на все мои страницы. Мой логин находится на той же странице, что и моя домашняя страница, поэтому всякий раз, когда мой пользователь входит в систему, я хочу скрыть часть входа в систему на моей домашней странице.

Widget login(bool visibleLogin) {
  return Visibility(
    visible: visibleLogin,
    child: Align(
      alignment: Alignment.bottomCenter,
      child: Padding(
        padding: const EdgeInsets.only(bottom: 78.0),
        child: Container(
          height: 90,
          color: Colors.transparent,
          margin: EdgeInsets.fromLTRB(8.0, 0.0, 8.0, 0.0),
          child: Container(
            child: Container(
              margin: EdgeInsets.only(top: 20.0),
              child: Column(
                children: [
                  Padding(
                    padding: EdgeInsets.only(top: 5.0),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        GestureDetector(
                          onTap: () => auth.signInWithGoogle(),
                          child: Container(
                            padding: EdgeInsets.all(10.0),
                            child: Icon(
                              FontAwesome.google,
                              color: kOrange,
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    ),
  );
}

Когда мой пользователь входит в систему, пользовательский интерфейс моего приложение не обновляется автоматически моим FutureBuilder, поэтому я вызываю прослушиватель onAuthStateChanged в моем initState () моей домашней страницы:

 void isSignedIn() {
    _auth.onAuthStateChanged.listen((user) {
      if (user != null) {
        setState(() {});
      } else {
        print('no user');
      }
    });
  }
}

После проверки этот метод запускается, но мой интерфейс обновляется только когда я закрываю и перезапускаю свое приложение. Как мне обновить свой пользовательский интерфейс, как только мой пользователь войдет в систему?

1 Ответ

1 голос
/ 07 мая 2020
• 1000 Прибывает, он изменит данные.

Обновление:

Вам даже не нужно изменять какую-либо переменную или вызывать какой-либо метод, теперь просто проверьте привязку и отобразите экран соответственно. make для проверки состояния подключения выполняется, потому что до этого времени он будет возвращать null, даже если пользователь находится в системе.

StreamBuilder(
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (_, snap) {
        if(snap.connectionState == ConnectionState.active){
          if(snap.data == null){
            // return with out login
          }else{
            // return  login
          }
        }else{
          return CircularProgressIndicator();
        }
      },
    ),

Обновление:

  Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        StreamBuilder(
          stream: FirebaseAuth.instance.onAuthStateChanged,
          builder: (_, snap) {
            print(snap.connectionState);
            if (snap.connectionState == ConnectionState.active) {
              print(snap.data.toString());
              if (snap.data == null) {
                return Text("not login");
              } else {
                return Text("login");
              }
            } else {
              return CircularProgressIndicator();
            }
          },
        ),
        RaisedButton(
          child: Text("hello"),
          onPressed: () {
            var a = FirebaseAuth.instance.signInAnonymously();
            print(a);
          },
        ),
        RaisedButton(
          child: Text("Log out"),
          onPressed: () {
            var a = FirebaseAuth.instance.signOut();
            print(a);
          },
        )
      ],
    ),
...