将供应商与不更新的蒸汽供应商结合

Combining Provider with a steam provider not updating

我正在研究一种技术来确定某些人是否具有显示编辑图标的提升权限。我使用 Firebase 进行身份验证,使用 firestore 进行后端。

我的想法是让页面快速检查特定部分中的记录,要求用户位于该部分中。 IE 有一个名为/admins/ 的部分。如果您的 uid 在该列表中,则规则只会让您读取该数据。我有那个工作。

所以我构建了一个 FutureProvider:

    final adminCheckProvider = FutureProvider<bool>((ref) async {
  bool admin = false;
  User? _uid = ref.watch(authStateChangesProvider).value;
  if (_uid != null) {
    print(_uid.uid);
    // Check for Admin Document
    final _fireStore = FirebaseFirestore.instance;
    await _fireStore
        .doc(FireStorePath.admin(_uid.uid))
        .get()
        .then((DocumentSnapshot documentSnapshot) {
      if (documentSnapshot.exists) {
        print('Document Exists: ${documentSnapshot.exists}');
        return true;
      }
    });
  }
  return false;
});

并有一个正在监视此提供商的小部件。

    class AdminEdit extends ConsumerWidget {
  const AdminEdit({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    AsyncValue<bool> isAdmin = ref.watch(adminCheckProvider);
    return isAdmin.when(
      data: (isAdmin) {
        print('Data Is In: $isAdmin');
        if (isAdmin) {
          return Text('Is An Admin');
        }
        return Text('Is Not Admin');
      },
      loading: () => Text('Is Not Admin'),
      error: (error, stackTrace) => Text('Error: $error'),
    );
  }
}

我看到调用最初 return 是错误的,但是当数据被 returned 并且确定文档确实存在时,它从未发出全部清除。我已经尝试了几种不同的方法,但尚未使 return 为真。这是一些终端输出

Data Is In: false
<<UID>>
Document Exists: true
Data Is In: false

如果我对此的处理方式有误,我也不介意听到。

提前谢谢大家!

看起来你默认返回 false 并且只在你的 future 中返回 true,而不是实际的 FutureProvider。

试试这样的东西,它应该会起作用:

final adminCheckProvider = FutureProvider<bool>((ref) async {
  User? _uid = ref.watch(authStateChangesProvider).value;
  if (_uid != null) {
    print(_uid.uid);
    // Check for Admin Document
    final _fireStore = FirebaseFirestore.instance;
    final doc = await _fireStore.doc(FireStorePath.admin(_uid.uid)).get();
    return doc.exists;
  } else {
    return false;
  }
});