将 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()”类型的参数?

为啥我应该将函数分配给 javascript 中的变量? [复制]

将 C++ 成员函数分配给 C 函数指针