我有一个按钮,在按下的方法,做一些异步任务。在这个任务结束时,我需要用新的更新的参数重新绘制整个widget。这是我的Widget类。
class UIMain extends StatefulWidget {
final bool loginState;
final String userID;
UIMain({Key key, @required this.loginState, @required this.userID})
: super(key: key);
@override
_UIMainState createState() => _UIMainState();
}
这是我的小部件类。onPressed
在这个类的状态下。按钮位于抽屉中。
onPressed: () async {
Navigator.pop(context); // this is being called to close the drawer
singOut().then((value) {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (BuildContext context) =>
UIMain(loginState: false, userID: null,)),
);
});
}
这是我正在执行的异步任务。
Future singOut() async {
await _auth.signOut();
await _googleSignIn.signOut();
}
我得到的是 Duplicate GlobalKey detected in widget tree.
错误。然而,这些变化反映了我想要的东西。
同样来自不同的小组件。
await googleSignIn().then((result) {
if (result != null) {
print(result);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (BuildContext context) => UIMain(
userID: result,
loginState: true,
)),
);
这引发了所有类型的错误。UI没有被渲染,因为它依赖于结果,而结果被传递为null。这里是signInMethod。
Future<String> googleSignIn() async {
if (await _googleSignIn.isSignedIn()) {
_googleSignIn.signInSilently();
} else {
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth =
await googleUser.authentication;
// get the credentials to (access / id token)
// to sign in via Firebase Authentication
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleAuth.accessToken, idToken: googleAuth.idToken);
_auth.signInWithCredential(credential);
}
return _googleSignIn.currentUser.id;
}
我不认为Navigator.pushReplacement是一个更好的方法。我也知道这些异步任务需要时间。我怎样才能确保在重绘之前得到一个非空的结果呢?UIMain()
的新参数。我还应该采用什么其他方法来重绘,而不是这个 Navigator.pushReplacement()
.
让Widget成为一个StatefulWidget,并调用setState方法来更新GUI。