【问题标题】:How to modify a variable using async method before it use in widget build?如何在小部件构建中使用之前使用异步方法修改变量?
【发布时间】:2021-09-06 23:16:56
【问题描述】:

我有一个名为userName 的变量,它依赖于数据库查询,所以异步是必须的。 我的旧代码可以这样总结

class IndexScreen extends StatefulWidget {
  @override
  _IndexScreenState createState() => _IndexScreenState();
}

//use database query function
Future<void> initUser() async{
  UserTable().getUserInfo(curUserEmail).then((value)=>null);
}

//show page
class _IndexScreenState extends State<IndexScreen> {
  @override
  Widget build(BuildContext context) {
    initUser().then((value){
    final theme = Theme.of(context);
    return WillPopScope(
      onWillPop: () =>router.navigateTo(context, '/welcome'),
      child: SafeArea(
        child: Scaffold(
//The static global variable is used in Body in other files
            body: Body()
        ),
      ),
    );
  });
}
}

它警告小姐return,我不知道如何修改我的代码。

谢谢!!

【问题讨论】:

  • 为什么不使用 FutureBuilder?完成未来后,按您的意愿加载屏幕会很有帮助。

标签: flutter asynchronous build widget future


【解决方案1】:

您可以使用 FutureBuilder 小部件来实现此目的。请参考下面的代码。

class IndexScreen extends StatefulWidget {
  @override
  _IndexScreenState createState() => _IndexScreenState();
}

//use database query function
Future<Map> initUser() async {
  final data =
      await UserTable().getUserInfo(curUserEmail);
  return data;
}

//show page
class _IndexScreenState extends State<IndexScreen> {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: initUser(),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.hasData) {
          final theme = Theme.of(context);
          return WillPopScope(
            onWillPop: () => router.navigateTo(context, '/welcome'),
            child: SafeArea(
              child: Scaffold(
                body: Body(),
              ),
            ),
          );
        } else {
          // Returns empty container untill the data is loaded
          Container();
        }
      },
    );
  }
}

【讨论】:

  • 应该是“else{return Container();}”吗?我运行这段代码,但它显示黑屏,我认为是 Container(),但 initUser() 函数已经完成,它没有改变。我怀疑这是我的 gteUserInfo() 方法不返回任何内容,它只是将值分配给静态变量
  • 我已经更新了sn-ps的代码。你能检查一下当前的代码 sn-p 并恢复吗?
  • 我看snapshot.connectionState 来修复我的特殊错误,谢谢!!
猜你喜欢
  • 2020-01-11
  • 1970-01-01
  • 2018-09-08
  • 2019-07-25
  • 2023-02-14
  • 1970-01-01
  • 2021-05-09
  • 2016-08-14
  • 1970-01-01
相关资源
最近更新 更多