1

我在按下的方法上有一个按钮,可以执行一些异步任务。在此任务结束时,我需要使用新的更新参数重新绘制整个小部件。这是我的小部件类。

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;
}

我不认为 N​​avigator.pushReplacement 是一种更好的做事方式。我也知道这些异步任务需要时间。UIMain()在使用新参数重新绘制之前,我如何确定我得到了一个非空结果。我应该采用什么其他方法来重绘而不是 this Navigator.pushReplacement()

4

1 回答 1

0

使 Widget 成为 StatefulWidget 并调用 setState 方法来更新 GUI。

于 2020-06-10T15:21:42.973 回答