在我的应用程序中,我使用riverpod和flutter_tts包来朗读http 响应。首先,我在 FutureProvider 中获取数据后添加它,如下所示:
final futureProvider = FutureProvider.family<String, String>((ref, itemId) async {
// fetch data from server
final result = await Future.delayed(Duration(seconds: 1)).then((value) => "$itemId");
await SpeakResult(result); // speak here
return result;
});
但即使使用相同的 itemId 多次调用 FutureProvider,它也只是第一次被大声朗读。
其次,我在build
方法中添加了它,但是在重建小部件时它总是被大声朗读。
useProvider(futureProvider("item id")).when(
loading: () => CircularProgressIndicator(),
error: (error, stackTrace) => Text("$error"),
data: (value) async {
await SpeakResult(value);
return Text("$value");
},
);
有什么想法可以解决这个问题吗?
完整代码在这里:
final futureProvider = FutureProvider.autoDispose.family<String, String>((ref, id) async {
ref.onDispose(() => print("disposed"));
// fetch data from server
final result = Future.delayed(Duration(seconds: 1)).then((value) => "$id");
// await SpeakResult(result);
return result;
});
final asyncListProvider = StateNotifierProvider((_) => AsyncList());
class AsyncList extends StateNotifier<List<AutoDisposeFutureProvider<String>>> {
AsyncList() : super([]);
void add(String id) {
/*
//I want to do something like this:
final asyncValue = futureProvider(id).whenData((value) async {
await SpeakResult(result);
return value;
});
*/
final asyncValue = futureProvider(id);
state = [asyncValue, ...state];
}
}
class MyHomePage extends HookWidget {
const MyHomePage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
final list = useProvider(asyncListProvider.state);
return ListView(
children: [
RaisedButton(
child: Text("Add data"),
onPressed: () {
context.read(asyncListProvider).add("item id");
},
),
for (final item in list)
useProvider(item).when(
loading: () => ListTile(
title: Center(child: CircularProgressIndicator()),
),
error: (error, stackTrace) => Text("$error"),
data: (value) {
// await SpeakResult(value);
return Text("$value");
},
),
],
);
}
}