Flutter中如何将Firebase的DocumentReference从函数传回调用方?
解决Firebase DocumentReference从异步函数传回调用链的问题
问题核心
你直接赋值DocumentReference newDocRef = ref.read(companyNotifierProvider.notifier).saveCompany(ref);失败,是因为**saveCompany是异步函数,返回的是Future<DocumentReference?>类型,必须通过await等待异步操作完成才能拿到实际返回值**。
解决方案步骤
1. 修改按钮 onPress 中的调用逻辑
在异步回调里添加await关键字,等待saveCompany执行完毕并获取返回的DocumentReference:
onPressed: () async { setState(() { showSpinner = true; }); try { ref.read(globalsNotifierProvider.notifier).updatenewCompany(true); // 添加await获取异步返回的DocumentReference final DocumentReference? newDocRef = await ref.read(companyNotifierProvider.notifier).saveCompany(ref); // 这里可以对newDocRef做后续操作,比如存入全局状态或传递到下一页 if (newDocRef != null) { // 示例:将文档引用保存到全局状态 // ref.read(globalsNotifierProvider.notifier).setCompanyDocRef(newDocRef); } Navigator.of(context).pushReplacement( MaterialPageRoute( builder: (context) => const UserProfileScreen(), ), ); setState(() { showSpinner = false; }); } catch (e) { // 完善错误处理逻辑 debugPrint(e.toString()); setState(() { showSpinner = false; }); } },
2. 统一saveCompany函数的返回值类型
原代码中else分支没有返回值,会触发编译警告,建议统一返回Future<DocumentReference?>,确保所有分支逻辑一致:
Future<DocumentReference?> saveCompany(WidgetRef ref, [String? companyId]) async { var newCompany = Company( companyName: ref.read(companyNotifierProvider).companyName, address1: ref.read(companyNotifierProvider).address1, address2: ref.read(companyNotifierProvider).address2, city: ref.read(companyNotifierProvider).city, companyState: ref.read(globalsNotifierProvider).currentCompanyState, zipCode: ref.read(companyNotifierProvider).zipCode, cellPhone: ref.read(companyNotifierProvider).cellPhone, officePhone: ref.read(companyNotifierProvider).officePhone, email: ref.read(companyNotifierProvider).email, website: ref.read(companyNotifierProvider).website, ); if (ref.read(globalsNotifierProvider).newCompany == true) { ref.read(globalsNotifierProvider.notifier).updatenewCompany(false); try { DocumentReference? newDocRef = await firestoreService.saveNewCompany(toMap(newCompany)); return newDocRef; } catch (e) { debugPrint(e.toString()); return null; } } else { // 更新公司时添加await确保操作完成,返回null(或根据实际需求返回对应引用) await firestoreService.saveCompany(toMap(newCompany), companyId!); return null; } }
3. 同步firestoreService.saveCompany的异步处理
如果firestoreService.saveCompany本身是异步函数,必须在调用时添加await,避免后续逻辑在数据库操作未完成时就执行。
关键注意点
- 异步函数的返回值是
Future类型,不能直接赋值,必须通过await或.then()获取实际结果。 - 要处理
null情况:saveNewCompany在异常时会返回null,使用newDocRef前务必判空,避免空指针异常。
内容的提问来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

