如何用不同的参数重绘整个widget树?

问题描述 投票:1回答:1

我有一个按钮,在按下的方法,做一些异步任务。在这个任务结束时,我需要用新的更新的参数重新绘制整个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().

flutter dart flutter-layout flutter-state
1个回答
0
投票

让Widget成为一个StatefulWidget,并调用setState方法来更新GUI。

© www.soinside.com 2019 - 2024. All rights reserved.