可以在 FutureBuilder 中刷新 ui 而无需重新加载数据吗?
Refresh ui without reload data in FutureBuilder is possible?
我有一个 id 使用来自 api 后端的随机数据的应用程序,我有一个浮动操作按钮将当前数据添加到收藏夹,当我点击收藏按钮时,图标需要根据布尔值更改值(在我的示例中命名为 recorded()),但我只能使用 setState(重建页面)来做到这一点,但这次整个页面的数据正在改变,因为我的 api 答案是随机的,相同 url,我的意思是每当我添加或删除当前数据页面重新加载另一个随机数据时,我需要绕过这个数据重新加载(我的示例中的 getData() 部分)并且只刷新我最喜欢的按钮的图标,有没有办法这样做,我尝试将另一个 FutureBuilder 用于 floataction 按钮和 setState 仅用于 recorded() 但结果仍然相同?
我的构造树是这样的:
@override
Widget build(BuildContext context) {
return Material(
child: FutureBuilder<Payload>(
future: getData(_name),
builder: (context, snapshot) {
Future<bool> recorded()async {
var checkFavs = await favoriteDao.findRecordById(snapshot.data.id);
return checkFavs == null ? Future<bool>.value(true) : Future<bool>.value(false);
}
if (snapshot.connectionState != ConnectionState.done && firstRun == true)
return Center(child: Image.asset("images/dice.gif"));
if (snapshot.connectionState == ConnectionState.done)
if (snapshot.hasError)
{
return Scaffold(...) // error page
}
return Scaffold(..
....
....
floatingActionButton: FutureBuilder(
future: recorded(),
builder: (context, AsyncSnapshot snapshots){
return FloatingActionButton(
onPressed: () async{
firstRun = false;
var myrecord = Myrecord(//data details for record//)
var checkFavs = await favoriteDao.findRecordById(snapshot.data.id);
if (checkFavs == null) {await favoriteDao.insertRecord(myrecord);}
else {await favoriteDao.deleteById(snapshot.data.id);}
setState(() {
recorded();
});
},
child: snapshots.hasData && snapshots.data ? Icon (Icon ( Icons.favorite_border,) : Icon (Icons.favorite,)
};
)
)
...
您不应在 FutureBuilder 中创建 Future,而应在 initState 方法中创建
@override
void initState() {
_getData = getData(_name)
super.initState()
}
@override
Widget build() {
return FutureBuilder<Payload>(
future: _getData,
builder: (context, snapshot) {
// your code
}
);
}
因为build()
会在setState
之后被调用,所以应该把Future的创建和build方法分开
我有一个 id 使用来自 api 后端的随机数据的应用程序,我有一个浮动操作按钮将当前数据添加到收藏夹,当我点击收藏按钮时,图标需要根据布尔值更改值(在我的示例中命名为 recorded()),但我只能使用 setState(重建页面)来做到这一点,但这次整个页面的数据正在改变,因为我的 api 答案是随机的,相同 url,我的意思是每当我添加或删除当前数据页面重新加载另一个随机数据时,我需要绕过这个数据重新加载(我的示例中的 getData() 部分)并且只刷新我最喜欢的按钮的图标,有没有办法这样做,我尝试将另一个 FutureBuilder 用于 floataction 按钮和 setState 仅用于 recorded() 但结果仍然相同?
我的构造树是这样的:
@override
Widget build(BuildContext context) {
return Material(
child: FutureBuilder<Payload>(
future: getData(_name),
builder: (context, snapshot) {
Future<bool> recorded()async {
var checkFavs = await favoriteDao.findRecordById(snapshot.data.id);
return checkFavs == null ? Future<bool>.value(true) : Future<bool>.value(false);
}
if (snapshot.connectionState != ConnectionState.done && firstRun == true)
return Center(child: Image.asset("images/dice.gif"));
if (snapshot.connectionState == ConnectionState.done)
if (snapshot.hasError)
{
return Scaffold(...) // error page
}
return Scaffold(..
....
....
floatingActionButton: FutureBuilder(
future: recorded(),
builder: (context, AsyncSnapshot snapshots){
return FloatingActionButton(
onPressed: () async{
firstRun = false;
var myrecord = Myrecord(//data details for record//)
var checkFavs = await favoriteDao.findRecordById(snapshot.data.id);
if (checkFavs == null) {await favoriteDao.insertRecord(myrecord);}
else {await favoriteDao.deleteById(snapshot.data.id);}
setState(() {
recorded();
});
},
child: snapshots.hasData && snapshots.data ? Icon (Icon ( Icons.favorite_border,) : Icon (Icons.favorite,)
};
)
)
...
您不应在 FutureBuilder 中创建 Future,而应在 initState 方法中创建
@override
void initState() {
_getData = getData(_name)
super.initState()
}
@override
Widget build() {
return FutureBuilder<Payload>(
future: _getData,
builder: (context, snapshot) {
// your code
}
);
}
因为build()
会在setState
之后被调用,所以应该把Future的创建和build方法分开