【发布时间】: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?
标签: flutter dart build widget future