如何检查 Flutter 中的 Future 变量是不是发生了变化? [复制]

Posted

技术标签:

【中文标题】如何检查 Flutter 中的 Future 变量是不是发生了变化? [复制]【英文标题】:How to check if a Future variable has changed in Flutter? [duplicate]如何检查 Flutter 中的 Future 变量是否发生了变化? [复制] 【发布时间】:2021-04-08 05:46:48 【问题描述】:

我正在用 Flutter 制作一个移动应用程序,这让我在很长一段时间内都无法取得进展,所以我想我会问 ***!

我有一个在 Future 函数中声明的变量,而我真正想做的是:检查变量(它是一个数组)是否已被填充,如果是则显示结果,如果否则显示圆形进度条。我已经完成了大部分代码,但是,当它检查变量值时,它总是说它等于零,并且它会永远显示圆形进度条!使值显示的唯一方法是使用应用程序中包含的“搜索”或根本不包含此“如果”!

这是用于启动 _posts 变量的函数的代码,它在应用启动时被调用。

Future<void> fetchPosts([String tags]) async 
    var result;
    if (tags != null) 
      apiUrl += tags;
      result = await http.get(apiUrl);
      setState(() );
     else 
      result = await http.get(apiUrl);
      setState(() );
    
    _posts = json.decode(result.body);
  

这是显示所有内容的 Widget 的代码。

Widget build(BuildContext context) 
    return Scaffold(
        appBar: _messageSelected
            ? _defaultBar(context, appBarChange)
            : _editingBar(context, appBarChange),
        body: Container(
            child: _posts.length != 0
                   ^^^^^^^^^^^^^^^^^^
                ? RefreshIndicator(
                    child: GridView.count(
                        crossAxisCount: 2,
                        children: List.generate(_posts.length, (index) 
                          return InkWell(
                              onTap: () 
                                Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                    builder: (context) => DetailScreen(),
                                    settings: RouteSettings(
                                      arguments: _posts[index],
                                    ),
                                  ),
                                );
                              ,
                              child: Image.network(
                                _url(_posts[index]),
                                width: 270,
                                height: 270,
                                fit: BoxFit.cover,
                              ));
                        )),
                    onRefresh: () 
                      return _getData();
                    )
                : Center(child: CircularProgressIndicator())));
  

(我突出显示了它检查变量的部分,也许有一种方法可以在其中放置“while”?) 我如何让它在这里再次检查变量: Center(child: CircularProgressIndicator()))); 并显示正确的值?

我已经为此苦苦挣扎了一段时间,任何帮助、建议或反馈将不胜感激!提前致谢。

【问题讨论】:

你在哪里打电话给fetchPosts(...)?您是否尝试过使用 FutureBuilder? api.flutter.dev/flutter/widgets/FutureBuilder-class.html @rickimaru fetchPosts() 在应用程序启动时被调用,是的,FutureBuilder 正是我所需要的! 【参考方案1】:

您需要使用FutureBuilder,而不是直接在函数内调用 setState,它会监听传递给future: 参数的方法的变化,然后相应地设置状态。

在您的情况下,要实现这一点,您首先需要修改 future 方法

Future fetchPosts([String tags]) async 
    var result;
    if (tags != null) 
      apiUrl += tags;
    
    result = await http.get(apiUrl);
    _posts = json.decode(result.body);

   return Future.value(_posts);
  

然后用FutureBuilder包装你的小部件

...

body:Container(
  child: FutureBuilder(
  future:fetchPosts(..args),
  builder:(BuildContext context, AsyncSnapshot snapshot)

       if(!snapshot.hasData) return CircularProgressIndicator();

       if(snapshot.hasError) return Text("Something went wrong");

       return YourScreenWidget()
    
  )
)

您可以在 Flutter 文档 here 中阅读有关 FutureBuilder 的更多信息

【讨论】:

不需要return Future.value(_posts); 只需使用return _posts; 是的!这正是我所需要的!非常感谢哈哈哈。

以上是关于如何检查 Flutter 中的 Future 变量是不是发生了变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Flutter future<bool> 检查 Firestore 中是不是存在子集合

如何在 Flutter/Dart 中将 Future<double> 转换为 double?

有没有办法从 Flutter 中的 Future 函数获取反馈

如何在 Flutter 中返回 Future<Response>?

如何修复 Flutter 中的“参数类型 'Future<int>' 无法分配给参数类型 'int'”

Flutter + Hive 检查 Future Builder 的框中是不是存在值