Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 有没有办法让多个FutureBuilders从ChangeNotifier使用相同的未来?_Flutter_Dart - Fatal编程技术网

Flutter 有没有办法让多个FutureBuilders从ChangeNotifier使用相同的未来?

Flutter 有没有办法让多个FutureBuilders从ChangeNotifier使用相同的未来?,flutter,dart,Flutter,Dart,我有一个类(扩展ChangeNotifier-Provider包),它有一个返回未来的函数。我想做的是让我的UI代码中的多个FutureBuilder可以从这个函数中接收值,而不必为每个FutureBuilder调用该函数一次 然而,我发现我使用的每个FutureBuilder都会一次又一次地运行函数本身。我知道一定有一种方法可以通过提供者包暴露未来本身,但我似乎不知道如何 下面是扩展ChangeNotifier的类,它具有未来: class ApiService extends ChangeN

我有一个类(扩展ChangeNotifier-Provider包),它有一个返回未来的函数。我想做的是让我的UI代码中的多个FutureBuilder可以从这个函数中接收值,而不必为每个FutureBuilder调用该函数一次

然而,我发现我使用的每个FutureBuilder都会一次又一次地运行函数本身。我知道一定有一种方法可以通过提供者包暴露未来本身,但我似乎不知道如何

下面是扩展ChangeNotifier的类,它具有未来:

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();
          }
        },
      ),
    );
  }
}