将函数的 Future 类型结果分配给 Flutter Widget 中的变量
Assign Future typed result from function to a variable in Flutter Widget
我有一个 return 一个 Future 的函数,我想把它放在一个变量中,这样变量的值就保持不变,并且可以在小部件的其他函数中使用,只要小部件未重建。
这个值是一个sessionid,我想用它来访问在widget的“sub-widgets”中调用的webservices。现在我正在执行整个身份验证过程以在每次调用 web 服务时获取 sessionid。
这是我尝试过的:
@override
Widget build(BuildContext context)async{
sessionid = await getSessionId();
但是当我使用 async await 时,我的构建方法必须 return 一个未来,但构建方法实际上不能 return 一个未来,所以我在这里有点受阻。
如有任何帮助,我们将不胜感激,
更新:
我创建了这个函数来设置变量值:
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());
}
)
这是
谢谢,
创建一个 Future 方法,例如,
setSessionId() async {
sessionid = await getSessionId();
}
在构建中调用上面的函数,
@override
Widget build(BuildContext context) {
setSessionId();
或者您也可以在 initState() 中调用 setSessionId(),如下所示,
@override
void initState() {
super.initState();
setSessionId();
}
我有一个 return 一个 Future 的函数,我想把它放在一个变量中,这样变量的值就保持不变,并且可以在小部件的其他函数中使用,只要小部件未重建。
这个值是一个sessionid,我想用它来访问在widget的“sub-widgets”中调用的webservices。现在我正在执行整个身份验证过程以在每次调用 web 服务时获取 sessionid。
这是我尝试过的:
@override
Widget build(BuildContext context)async{
sessionid = await getSessionId();
但是当我使用 async await 时,我的构建方法必须 return 一个未来,但构建方法实际上不能 return 一个未来,所以我在这里有点受阻。
如有任何帮助,我们将不胜感激,
更新:
我创建了这个函数来设置变量值:
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());
}
)
这是 谢谢,
创建一个 Future 方法,例如,
setSessionId() async {
sessionid = await getSessionId();
}
在构建中调用上面的函数,
@override
Widget build(BuildContext context) {
setSessionId();
或者您也可以在 initState() 中调用 setSessionId(),如下所示,
@override
void initState() {
super.initState();
setSessionId();
}