我在按下的方法上有一个按钮,可以执行一些异步任务。在此任务结束时,我需要使用新的更新参数重新绘制整个小部件。这是我的小部件类。
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()
在使用新参数重新绘制之前,我如何确定我得到了一个非空结果。我应该采用什么其他方法来重绘而不是 this Navigator.pushReplacement()
。