将 Future 类型化结果从函数分配给 Flutter Widget 中的变量
Posted
技术标签:
【中文标题】将 Future 类型化结果从函数分配给 Flutter Widget 中的变量【英文标题】:Assign Future typed result from function to a variable in Flutter Widget 【发布时间】:2021-12-16 23:24:25 【问题描述】:我有一个返回 Future 的函数,我想把它放在一个变量中,这样变量的值就保持不变,并且只要不重建小部件,就可以在小部件的其他功能中使用。
这个值是一个 sessionid,我想用它来访问在小部件的“子小部件”中调用的 web 服务。现在,我正在执行整个身份验证过程,以在每次调用 web 服务时获取 sessionid。
这是我尝试过的:
@override
Widget build(BuildContext context)async
sessionid = await getSessionId();
但是当我使用 async await 时,我的 build 方法必须返回一个 Future,但是 build 方法实际上不能返回一个 Future,所以我在这里有点受阻。
任何帮助将不胜感激,
更新:
我创建了这个函数来设置变量值:
setJsessionId()async
var new_jsessionId = await getJsessionId();
setState(()
jsessionId = new_jsessionId;
);
我在这里称呼它:
@override
Widget build(BuildContext context)
setJsessionId();
它可以工作,但问题是它不断重建小部件并永远调用身份验证功能和网络服务,
我调用 web 服务来构建一个 reorderableListView,它会不断复制结果而不会停止:
这是我用来显示此列表的 FutureBuilder 的代码:
child: FutureBuilder<List<Task>>(
future:
getTasks(),
builder: (BuildContext context, AsyncSnapshot<List<Task>> snapshot)
if(snapshot.hasError)
return const Text('Erreur');
if(snapshot.hasData)
return ReorderableListView(
buildDefaultDragHandles: false,
header: Center(
child: Container(
child: Text(
'Listes des tâches',
style: Theme.of(context).textTheme.headline5,
),
padding: EdgeInsets.symmetric(vertical: 20)
)
),
children: taskList.map((e) => ListTile(
key: UniqueKey(),
//leading: Icon(BeoticIcons.disc),
leading: Image.asset("assets/images/Task-Bleu_0.png", height: 30),
title: Text("Tache: " + e.name),
subtitle: Text("Projet: " + e.projectName),
//trailing: Icon(BeoticIcons.circle_check, color: Colors.green)
trailing: Wrap(
spacing: 5,
children: [
Image.asset("assets/images/Task-Validated_0.png", height: 30),
GestureDetector(
onTap: ()
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => TaskInfoPage(task: e)
),
);
,
child: Icon(BeoticIcons.simply_right, size: 28)
)
]
)
)).toList(),
onReorder: _onReorder,
);
return const Center(child: CircularProgressIndicator());
)
这里是 谢谢,
【问题讨论】:
这能回答你的问题吗? What is a Future and how do I use it? 【参考方案1】:创建一个未来方法,例如,
setSessionId() async
sessionid = await getSessionId();
在构建中调用上面的函数,
@override
Widget build(BuildContext context)
setSessionId();
或者您也可以在 initState() 中调用 setSessionId(),如下所示,
@override
void initState()
super.initState();
setSessionId();
【讨论】:
您至少需要一个有状态的小部件并调用 setState() 才能使其工作。 感谢你们的帮助,我试过了,它几乎可以工作,但我得到重复的结果,请参阅上面的更新 实际上是在 build 方法中调用该函数时,我得到了重复的结果,当我尝试在 initState 方法中调用它时,它工作正常。另外,@nvoigt 是绝对正确的,变量的更新需要封装在一个 setState 函数中。以上是关于将 Future 类型化结果从函数分配给 Flutter Widget 中的变量的主要内容,如果未能解决你的问题,请参考以下文章
将 Lambda 函数分配给 serverless.yml 中的特定 VPC ID
如何将“Function”类型的参数分配给“void Function()”类型的参数?