如何在小部件构建中使用之前使用异步方法修改变量?

Posted

技术标签:

【中文标题】如何在小部件构建中使用之前使用异步方法修改变量?【英文标题】: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?完成未来后,按您的意愿加载屏幕会很有帮助。 【参考方案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();
        
      ,
    );
  


【讨论】:

应该是“elsereturn Container();”吗?我运行这段代码,但它显示黑屏,我认为是 Container(),但 initUser() 函数已经完成,它没有改变。我怀疑这是我的 gteUserInfo() 方法不返回任何内容,它只是将值分配给静态变量 我已经更新了sn-ps的代码。你能检查一下当前的代码 sn-p 并恢复吗? 我看snapshot.connectionState 来修复我的特殊错误,谢谢!!

以上是关于如何在小部件构建中使用之前使用异步方法修改变量?的主要内容,如果未能解决你的问题,请参考以下文章

使用异步数据调用在小部件内绑定“foreach”

除了 setstate 颤振之外,如何在小部件构建中获取值

在小部件构建期间如何在颤动中导航?

jQuery UI - 我啥时候应该在小部件上使用 destroy 方法

如何使用 PyQt 在小部件上绘制点和线

ScaffoldMessenger.of(context).showSnackBar() 在小部件构建函数中直接调用时不起作用