Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 Flatter RiverPod:如何将每次运行的后处理添加到FutureProvider?_Flutter_Riverpod - Fatal编程技术网

Flutter Flatter RiverPod:如何将每次运行的后处理添加到FutureProvider?

Flutter Flatter RiverPod:如何将每次运行的后处理添加到FutureProvider?,flutter,riverpod,Flutter,Riverpod,在我的应用程序中,我使用和包大声读取http响应。 首先,我在FutureProvider中获取数据后添加了它,如下所示: final futureProvider=futureProvider.family((ref,itemId)异步{ //从服务器获取数据 最终结果=等待未来。延迟(持续时间(秒:1))。然后((值)=>“$itemId”); 等待SpeakResult(结果);//在这里发言 返回结果; }); 但即使FutureProvider使用同一个itemId被多次调用,它也只

在我的应用程序中,我使用和包大声读取http响应。 首先,我在FutureProvider中获取数据后添加了它,如下所示:

final futureProvider=futureProvider.family((ref,itemId)异步{
//从服务器获取数据
最终结果=等待未来。延迟(持续时间(秒:1))。然后((值)=>“$itemId”);
等待SpeakResult(结果);//在这里发言
返回结果;
});
但即使FutureProvider使用同一个itemId被多次调用,它也只是第一次被大声读出

其次,我在
build
方法中添加了它,但在重建小部件时,它总是被大声读出

useProvider(futureProvider(“项目id”))。当(
加载:()=>CircularProgressIndicator(),
错误:(错误,stackTrace)=>文本(“$error”),
数据:(值)异步{
等待SpeakResult(值);
返回文本(“$value”);
},
);
有什么办法解决这个问题吗

完整代码如下:


final futureProvider=futureProvider.autoDispose.family((ref,id)异步{
参考onDispose(()=>打印(“已处理”);
//从服务器获取数据
最终结果=未来。延迟(持续时间(秒:1))。然后((值)=>“$id”);
//等待SpeakResult(结果);
返回结果;
});
最终asyncListProvider=StateNotifierProvider(())=>AsyncList();
类AsyncList扩展了StateNotifier{
AsyncList():超级([]);
无效添加(字符串id){
/*
//我想这样做:
最终asyncValue=futureProvider(id).whenData((值)async{
等待SpeakResult(结果);
返回值;
});
*/
最终asyncValue=futureProvider(id);
状态=[asyncValue,…状态];
}
}
类MyHomePage扩展了Widget{
constmyhomepage({Key}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
最终列表=useProvider(asyncListProvider.state);
返回列表视图(
儿童:[
升起的按钮(
子项:文本(“添加数据”),
已按下:(){
read(asyncListProvider).add(“项目id”);
},
),
用于(列表中的最后一项)
useProvider(项目)。何时使用(
加载:()=>ListTile(
标题:中心(子项:CircularProgressIndicator()),
),
错误:(错误,stackTrace)=>文本(“$error”),
数据:(数值){
//等待SpeakResult(值);
返回文本(“$value”);
},
),
],
);
}
}

使用提供程序的一个好处是,它们非常有效,因为它们只计算一次值,除非发生会改变该值的变化

您在第一个示例中看到该行为的原因:

但即使FutureProvider使用同一个itemId被多次调用,它也只是第一次被大声读出

是因为我上面提到的提供者的属性。如果你给你的未来供应商添加一个,我相信这会解决你的问题


另外,在第二个示例中,它总是被大声读出的原因是,当任何内容发生更改时,构建方法中的所有内容都会被重建,即使这些内容在视觉上并不明显。这可以追溯到我关于提供程序高效的第一点,因为您不必重新评估所提供的值,除非您明确地想要这种行为。

使用提供程序的一个好处是,它们是高效的,因为它们只计算一次值,除非某些更改会改变该值

您在第一个示例中看到该行为的原因:

但即使FutureProvider使用同一个itemId被多次调用,它也只是第一次被大声读出

是因为我上面提到的提供者的属性。如果你给你的未来供应商添加一个,我相信这会解决你的问题


另外,在第二个示例中,它总是被大声读出的原因是,当任何内容发生更改时,构建方法中的所有内容都会被重建,即使这些内容在视觉上并不明显。这可以追溯到我的第一个观点,即提供程序是高效的,因为除非您明确希望这样做,否则您不必重新评估提供的值。

在我的完整代码中,所有提供程序都会显示状态或结果。所以我认为它们都没有被处理过。这就是问题所在,你应该将autoDispose装饰器添加到你的futureProvider中。编辑了本期的代码。我添加了autoDispose装饰器,但它没有被处理。我不想处理这个提供者。返回缓存的http响应,但每次都进行post处理。在我的完整代码中,所有提供程序都被监听以显示状态或结果。所以我认为它们都没有被处理过。这就是问题所在,你应该将autoDispose装饰器添加到你的futureProvider中。编辑了本期的代码。我添加了autoDispose装饰器,但它没有被处理。我不想处理这个提供者。返回缓存的http响应,但每次都进行后期处理。