gpt4 book ai didi

firebase - Flutter-用户登录Firebase时FutureBuilder无法重建吗?

转载 作者:行者123 更新时间:2023-12-03 03:34:59 27 4
gpt4 key购买 nike

我正在尝试使用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,
),
),
),
],
),
),
],
),
),
),
),
),
),
);
}

当我的用户登录时,我的应用程序的UI不会被FutureBuilder自动更新,因此我在主页的initState()中调用onAuthStateChanged侦听器:
 void isSignedIn() {
_auth.onAuthStateChanged.listen((user) {
if (user != null) {
setState(() {});
} else {
print('no user');
}
});
}
}

经过检查后,此方法被触发,但是我的UI仅在我关闭并重新启动我的应用程序时得到更新。用户登录后,如何更新UI?

最佳答案

我认为FutureBuilder无法做到这一点,您必须使用StreamBuilder来实现此功能。

一旦Future完成,它就不会寻找任何更改,就好像您在使用流一样,只要有新数据到达,它就会更改数据。

更新:

您甚至不需要更改任何变量或调用任何方法,现在只需检查对齐并相应地显示屏幕即可。 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);
},
)
],
),

关于firebase - Flutter-用户登录Firebase时FutureBuilder无法重建吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61664222/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com