如何检查 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>?