gpt4 book ai didi

dart - Flutter 以编程方式触发 FutureBuilder

转载 作者:IT老高 更新时间:2023-10-28 12:37:49 39 4
gpt4 key购买 nike

假设我有这样的事情:

return FutureBuilder(
future: _loadingDeals,
builder: (BuildContext context, AsyncSnapshot snapshot) {
return RefreshIndicator(
onRefresh: _handleRefresh,
...
)
}
)

_handleRefresh 方法中,我想以编程方式触发 FutureBuilder 的重新运行。

有这种事吗?

用例:

当用户拉下 refreshIndicator 时,_handleRefresh 只会让 FutureBuilder 重新运行。

编辑:

完整的代码片段端到端,没有刷新部分。我已经切换到使用 StreamBuilderrefreshIndicator 部分如何适应所有这些?

class DealList extends StatefulWidget {
@override
State<StatefulWidget> createState() => new _DealList();
}

class _DealList extends State<DealList> with AutomaticKeepAliveClientMixin {
// prevents refreshing of tab when switch to
// Why? https://stackoverflow.com/q/51224420/1757321
bool get wantKeepAlive => true;

final RestDatasource api = new RestDatasource();
String token;
StreamController _dealsController;

@override
void initState() {
super.initState();
_dealsController = new StreamController();
_loadingDeals();
}

_loadingDeals() async {
SharedPreferences prefs = await SharedPreferences.getInstance();

this.token = prefs.getString('token');

final res =
this.api.checkInterests(this.token).then((interestResponse) async {
_dealsController.add(interestResponse);
return interestResponse;
});
return res;
}

_handleRefresh(data) async {
SharedPreferences prefs = await SharedPreferences.getInstance();

final token = prefs.getString('token');
await this.api.checkInterests(token).then((interestResponse) {
_dealsController.add(interestResponse);
});
return null;
}

@override
Widget build(BuildContext context) {
super.build(context); // <-- this is with the wantKeepAlive thing
return StreamBuilder(
stream: _dealsController.stream,
builder: (BuildContext context, AsyncSnapshot snapshot) {

if (snapshot.hasError) {
...
}

if (snapshot.connectionState != ConnectionState.done) {
return Center(
child: CircularProgressIndicator(),
);
}

if (!snapshot.hasData &&
snapshot.connectionState == ConnectionState.done) {
return Text('No deals');
}

if (snapshot.hasData) {
return ListView.builder(
physics: const AlwaysScrollableScrollPhysics(),
itemCount: snapshot.data['deals'].length,
itemBuilder: (context, index) {
final Map deal = snapshot.data['deals'][index];
return ListTile(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DealsDetailPage(
dealDetail: deal,
),
),
);
},
title: Text(deal['name']),
subtitle: Text(deal['expires']),
);
},
),
}
},
);
}
}

最佳答案

为什么不使用 StreamBuilder 和 Stream 而不是 FutureBuilder?

类似的...

class _YourWidgetState extends State<YourWidget> {
StreamController<String> _refreshController;

...
initState() {
super...
_refreshController = new StreamController<String>();
_loadingDeals();
}

_loadingDeals() {
_refreshController.add("");
}

_handleRefresh(data) {
if (x) _refreshController.add("");
}

...
build(context) {
...
return StreamBuilder(
stream: _refreshController.stream,
builder: (BuildContext context, AsyncSnapshot snapshot) {
return RefreshIndicator(
onRefresh: _handleRefresh(snapshot.data),
...
)
}
);
}
}

我使用 StreamBuilder 创建了一个带有 Flutter 主要示例的 Gist,check it out

关于dart - Flutter 以编程方式触发 FutureBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51663378/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com