使用
将数据添加到我的 Firestore 数据库Future<void> addNewData(BuildContext context, String data) {
return showModalBottomSheet(
context: context,
builder: (context) {
return Scaffold(
// add data in a text field and using a button post to firestore
);
}
);
}
我想要更新 FutureProvider,其定义为
@riverpod
class FetchData extends _$FetchData {
@override
Future<List<Data>> build() async {
List<Data> _myList = [];
final snapshot = await FirebaseFirestore.instance
.collection('data')
.get();
for (var doc in snapshot.docs) {
_myList.add(Data.fromMap(doc));
}
return _myList;
}
}
此外,还使用一个函数来手动设置 TextField 的值,并通过 SecondProvider 通知此更改。该提供程序在 PerformOperation 函数中读取 fetchDataProvider 的状态。
@riverpod
class SecondProvider extends _$SecondProvider {
@override
String? build() {
return '';
}
void performOperation(String data) {
final AsyncValue<List<Data>> myList = ref.read(fetchDataProvider);
String uid = '';
if (myList.value != null && myList.hasValue) {
int checked = 0;
if (myList.value!.length > 0) {
for (var item in myList.value!) {
if (item == data) {
uid = item;
state = uid;
break;
}
checked = checked + 1;
/// If data did not match to any of the myList items from base then set to empty
if (checked == myList.value!.length) {
state = uid;
}
}
} else {
state = uid;
}
}
}
}
所以,在 UI 代码中,在按钮的 onPressed 内,我这样做
addNewData(context, dataController!.text).then((_) {
ref.invalidate(fetchDataProvider);
ref.read(SecondProvider.notifier).performOperation(dataController!.text);
});
由于
ref.invalidate
需要时间,之后 ref.read
确实会给出错误的 ''
状态;
上面的代码是简化版本,当 Data 是一个类并且其字段之一是由数据库生成时,这将更有意义。第二个提供程序需要该数据库生成的字段。
如何等待获取数据提供程序更新新值然后执行执行操作?或者我在概念上做错了什么。
谢谢
你可以尝试做:
final myList = await ref.read(fetchDataProvider.future);
它应该等待 fetchDataProvider 状态的加载。