【发布时间】:2020-04-18 00:20:35
【问题描述】:
我对 Flutter 比较陌生,目前正在努力使用 FutureBuilders。 我已经阅读了 Remi 在 thread 上的回答,它基本上说明了 Flutter 的理念,即小部件构建应该是幂等的。我在理论上得到了原理,但是实际上它是如何工作的呢?
考虑以下sn-p:
return Scaffold(
body: SafeArea(
child: Stack(
children: [
Consumer<DataPresenter>(
builder: (context, presenter, _) {
return DefaultFutureBuilder<List<Data>>(
future: presenter.data(),
builder: (context, data) {
// bla bla
}
);
}
),
// More widgets
],
),
),
);
}
这是我的DefaultFutureBuilder:
class DefaultFutureBuilder<T> extends StatelessWidget {
final Future<T> future;
final Widget Function(BuildContext, T data) builder;
final Widget Function(BuildContext) errorBuilder;
DefaultFutureBuilder({
@required this.future,
@required this.builder,
this.errorBuilder,
});
@override
Widget build(BuildContext context) {
var errBuilder = errorBuilder ?? _buildDefaultErrorScreen;
return FutureBuilder<T>(
future: future,
builder: (context, snapshot) {
var indicator = Center(child: CircularProgressIndicator());
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData)
return builder(context, snapshot.data);
else if (snapshot.hasError)
return errBuilder(context);
}
return indicator;
},
);
}
Widget _buildDefaultErrorScreen(BuildContext context) {
// default
}
}
现在我知道对 presenter.data() 的调用(获取一些异步数据)不符合犹太教规。但是我确实想在演示者通知消费者时重新获取数据,同时我不想在 Flutter 由于框架恶作剧而重建我的小部件树时获取它。
我最初的想法是构建演示者,以便它仅在当前没有任何数据时获取数据。然后,我可以通过其他方法将数据设置为 null,并通知侦听器重建受影响的小部件子树。
像这样:
class DataPresenter extends ChangeNotifier {
// fields, services, bla bla
List<Data> _data;
Future<List<Data>> data() async {
if (_data == null) {
var response = await _service.fetchMyStuff(params: params);
_data = response.data;
}
return _data;
}
}
这个解决方案的问题是,当我第一次获取数据时发生的任何重建都会导致另一个请求。
如果有人能指出我没有得到框架/架构的哪一部分,我将不胜感激。
【问题讨论】:
-
您的
DataPresenter中似乎有一些拼写错误,对吗?您正在检查_datas是否为空,否则您将获取,然后将_pets设置为获取的结果(而不是_datas)。然后你返回_data,而不是_pets而不是_datas。 -
如果你想“重新获取”最新的数据快照,为什么不使用
StreamBuilder呢? -
@matehat,你是对的。我修正了错别字
-
简而言之:如果您想要一个镜头通知,您可以使用
FutureBuilder,它具有“等待”和“完成”(带有最终数据)状态 - 如果您想要多个通知,您需要一个StreamBuilder使用最新数据产生“等待”和多个“活动”状态 -
是的,确切地说,请参阅Creating streams in Dart 了解有关 dart 流的更多信息,您也可以使用
rx-dart包,为流添加许多有用的东西
标签: flutter future flutter-provider