将函数的 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();
}