如何在小部件构建中使用之前使用异步方法修改变量?
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
来修复我的特殊错误,谢谢!!以上是关于如何在小部件构建中使用之前使用异步方法修改变量?的主要内容,如果未能解决你的问题,请参考以下文章
jQuery UI - 我啥时候应该在小部件上使用 destroy 方法
ScaffoldMessenger.of(context).showSnackBar() 在小部件构建函数中直接调用时不起作用