Flutter 有没有办法让多个FutureBuilders从ChangeNotifier使用相同的未来?
我有一个类(扩展ChangeNotifier-Provider包),它有一个返回未来的函数。我想做的是让我的UI代码中的多个FutureBuilder可以从这个函数中接收值,而不必为每个FutureBuilder调用该函数一次 然而,我发现我使用的每个FutureBuilder都会一次又一次地运行函数本身。我知道一定有一种方法可以通过提供者包暴露未来本身,但我似乎不知道如何 下面是扩展ChangeNotifier的类,它具有未来:Flutter 有没有办法让多个FutureBuilders从ChangeNotifier使用相同的未来?,flutter,dart,Flutter,Dart,我有一个类(扩展ChangeNotifier-Provider包),它有一个返回未来的函数。我想做的是让我的UI代码中的多个FutureBuilder可以从这个函数中接收值,而不必为每个FutureBuilder调用该函数一次 然而,我发现我使用的每个FutureBuilder都会一次又一次地运行函数本身。我知道一定有一种方法可以通过提供者包暴露未来本身,但我似乎不知道如何 下面是扩展ChangeNotifier的类,它具有未来: class ApiService extends ChangeN
class ApiService extends ChangeNotifier {
CurrencyTicker _data;
CurrencyTicker get getdata => _data;
set setdata(CurrencyTicker data) {
_data = data;
}
Future<CurrencyTicker> fetchBaseData() async {
final response =
await http.get(API_URL_HERE); // url removed for stackoverflow
if (response.statusCode == 200) {
print('1 call logged');
setdata = CurrencyTicker.fromJson(json.decode(response.body));
return CurrencyTicker.fromJson(json.decode(response.body));
} else {
throw Exception('Request failed: ' + response.statusCode.toString());
}
}
}
class API服务扩展了ChangeNotifier{
CurrencyTicker_数据;
CurrencyTicker获取getdata=>\u数据;
设置setdata(当前股票数据){
_数据=数据;
}
Future fetchBaseData()异步{
最后答复=
等待http.get(API_URL_HERE);//为stackoverflow删除的URL
如果(response.statusCode==200){
打印(“1个呼叫记录”);
setdata=CurrencyTicker.fromJson(json.decode(response.body));
返回CurrencyTicker.fromJson(json.decode(response.body));
}否则{
抛出异常('请求失败:'+response.statusCode.toString());
}
}
}
以下是UI代码(它只是一个FutureBuilder):
类MyBody扩展了无状态小部件{
constmybody({Key}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
最终提供者=提供者(上下文);
返回中心(
孩子:未来建设者(
future:provider.fetchBaseData(),
initialData:CurrencyTicker().价格,
生成器:(BuildContext上下文,异步快照){
if(snapshot.connectionState==connectionState.done){
返回行(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
文本(快照.数据.公司),
],
);
}否则{
返回LinearProgressIndicator();
}
},
),
);
}
}
我没有在小部件树中包含处于“顶层”的MultiProvider,因为我不明白为什么要这样做。我还没有包括CurrencyTicker类的型号。如果有必要,我可以提供这两个
如果您不想直接在消费者的构建方法中执行HTTP调用,请在此处输入任何信息 不应在ChangeNotifier上公开方法,而应公开属性:
将MyNotifier与ChangeNotifier一起分类{
未来食品;
}
foo
是存储上次fetchData
调用结果的变量
根据您的需要,您可以:
- 如果立即需要,在构造函数中调用
fetchData
将MyNotifier与ChangeNotifier一起分类{
MyNotifier(){
foo=fetchData();
}
未来食品;
}
- 使用自定义getter延迟加载它:
将MyNotifier与ChangeNotifier一起分类{
未来(u foo),;
Future get foo=>\u foo???=fetchData();
}
您不希望直接在使用者的构建方法内部执行HTTP调用
不应在ChangeNotifier上公开方法,而应公开属性:
将MyNotifier与ChangeNotifier一起分类{
未来食品;
}
foo
是存储上次fetchData
调用结果的变量
根据您的需要,您可以:
- 如果立即需要,在构造函数中调用
fetchData
将MyNotifier与ChangeNotifier一起分类{
MyNotifier(){
foo=fetchData();
}
未来食品;
}
- 使用自定义getter延迟加载它:
将MyNotifier与ChangeNotifier一起分类{
未来(u foo),;
Future get foo=>\u foo???=fetchData();
}
如果要对流执行此操作,请确保将其设置为广播流以避免错误:`foo=fetchData().asBroadcastStream()`如果使用流执行此操作,请确保将其设置为广播流以避免错误:`foo=fetchData().asBroadcastStream()`
class MyBody extends StatelessWidget {
const MyBody({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
final provider = Provider.of<ApiService>(context);
return Center(
child: FutureBuilder(
future: provider.fetchBaseData(),
initialData: CurrencyTicker().price,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text(snapshot.data.company),
],
);
} else {
return LinearProgressIndicator();
}
},
),
);
}
}