【问题标题】:Assign Future typed result from function to a variable in Flutter Widget将 Future 类型化结果从函数分配给 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());
          }
        )

这里是 谢谢,

【问题讨论】:

标签: flutter dart build widget future


【解决方案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 函数中。
猜你喜欢
  • 2021-06-04
  • 2021-07-06
  • 2023-01-20
  • 2020-11-20
  • 2019-12-06
  • 2020-08-23
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
相关资源
最近更新 更多