在 ref.invalidate(firstProvider) 之后使用 ref.read(secondProvider.notifier).performOperation() ,其中 PerformOperation 读取firstProvider

问题描述 投票:0回答:1

使用

将数据添加到我的 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 是一个类并且其字段之一是由数据库生成时,这将更有意义。第二个提供程序需要该数据库生成的字段。 如何等待获取数据提供程序更新新值然后执行执行操作?或者我在概念上做错了什么。

谢谢

flutter riverpod
1个回答
0
投票

你可以尝试做:

 final  myList =  await ref.read(fetchDataProvider.future);

它应该等待 fetchDataProvider 状态的加载。

© www.soinside.com 2019 - 2024. All rights reserved.