如何检查 Flutter 中的 Future 变量是否已更改?
How to check if a Future variable has changed in Flutter?
我正在用 Flutter 制作一个移动应用程序,这让我在很长一段时间内无法取得进展,所以我想我应该问问 Whosebug!
我有一个在 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 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())));
并显示正确的值?
我已经为此苦苦挣扎了一段时间,如有任何帮助、建议或反馈,我们将不胜感激!提前致谢。
不是直接在函数内调用 setState,您需要为此使用 FutureBuilder
,它会监听传递给 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
的更多信息
我正在用 Flutter 制作一个移动应用程序,这让我在很长一段时间内无法取得进展,所以我想我应该问问 Whosebug!
我有一个在 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 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())));
并显示正确的值?
我已经为此苦苦挣扎了一段时间,如有任何帮助、建议或反馈,我们将不胜感激!提前致谢。
不是直接在函数内调用 setState,您需要为此使用 FutureBuilder
,它会监听传递给 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
的更多信息