Flutter集成Firestore遇权限拒绝及DynamiteModule加载错误求助
Flutter集成Firebase Firestore问题排查与解决
在Flutter项目集成Firebase Firestore时,遇到DynamiteModule加载警告,以及点击按钮调用DocumentReference.get()时触发Firestore权限拒绝未处理异常,相关日志和代码如下:
运行日志
W/DynamiteModule( 6380): 未找到com.google.android.gms.providerinstaller.dynamite的本地模块描述类。 I/DynamiteModule( 6380): 正在考虑本地模块com.google.android.gms.providerinstaller.dynamite:0和远程模块com.google.android.gms.providerinstaller.dynamite:0 W/ProviderInstaller( 6380): 加载providerinstaller模块失败:未找到可接受的com.google.android.gms.providerinstaller.dynamite模块。本地版本为0,远程版本为0。 W/Firestore( 6380): (24.4.0) [Firestore]: 监听Query(target=Query(users/firstName order by <strong>name</strong>);limitType=LIMIT_TO_FIRST)失败:Status{code=PERMISSION_DENIED, description=权限缺失或不足, cause=null} E/flutter ( 6380): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] 未处理异常:[cloud_firestore/permission-denied] 调用者无权限执行指定操作。 E/flutter ( 6380): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:653:7) E/flutter ( 6380): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:296:18) E/flutter ( 6380): E/flutter ( 6380): #2 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:499:43) E/flutter ( 6380): E/flutter ( 6380): #3 MethodChannelDocumentReference.get (package:cloud_firestore_platform_interface/src/method_channel/method_channel_document_reference.dart:69:42) E/flutter ( 6380): E/flutter ( 6380): #4 _JsonDocumentReference.get (package:cloud_firestore/src/document_reference.dart:146:7) E/flutter ( 6380): E/flutter ( 6380): #5 ProductList.build. (package:firebasekurulum/basket.dart:16:28) E/flutter ( 6380): E/flutter ( 6380): W/Firestore( 6380): (24.4.0) [WatchStream]: (f4f9d06) 流已关闭,状态:Status{code=CANCELLED, description=断开空闲流。等待新目标超时, cause=null}。
项目代码
main.dart
import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'basket.dart'; void main() async{ WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: ProductList() ); } }
basket.dart
import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_core/firebase_core.dart'; class ProductList extends StatelessWidget { final fireStore = FirebaseFirestore.instance; @override Widget build(BuildContext context) { CollectionReference datas = fireStore.collection('users'); var ref = datas.doc('firstName'); return Scaffold( body: Center( child: TextButton( child: Text("press"), onPressed: () async { var response = await ref.get(); print("here is your data : $response['firsName']"); }, )), ); } }
解决方法
1. Firestore权限拒绝错误(核心问题)
该错误源于Firestore默认安全规则禁止未授权访问:
- 临时调试方案:在Firebase控制台的Firestore规则页面,将规则修改为:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }
注意:上线前必须替换为严格权限规则,比如限制仅认证用户访问:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if request.auth != null; } } }
2. DynamiteModule加载警告
该警告多因设备Google Play服务版本过低或不完整,一般不影响功能:
- 确保测试设备/模拟器安装最新版Google Play服务;
- 模拟器选择包含Google Play的系统镜像;
- 执行
flutter clean清理缓存后重新运行项目。
3. 代码语法错误修正
basket.dart中的打印语句存在变量解析和拼写错误,修改为:
print("here is your data : ${response['firstName']}");
内容的提问来源于stack exchange,提问作者Emir
相关产品推荐
相关产品推荐

