【发布时间】:2021-04-25 05:11:37
【问题描述】:
大家晚上好,实际上我创建了一个文件,其中包含一些基于 firestore 的函数,我必须在其他文件中重用这些函数,代码如下:
import 'dart:math';
import 'dart:async';
import 'package:cron/cron.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:provider/provider.dart';
import 'package:goodgoals_android/services/authentication.dart';
abstract class Service {
Future<void> NumberGenerator();
Future<void> MissionRetriever1();
Future<void> MissionRetriever2();
Future<void> MissionRetriever3();
Future<void> MissionRetriever4();
}
class MissionService implements Service {
MissionService({this.auth});
int missionNumber1;
int missionNumber2;
int missionNumber3;
int missionNumber4;
int test = 10;
final BaseAuth auth;
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
final databaseReference = FirebaseFirestore.instance;
Future<void> NumberGenerator() {
final cron= Cron();
cron.schedule(Schedule.parse('*0**1'), () async { //Tutti i Lunedì alle 00;
Random random = new Random();
missionNumber1 = random.nextInt(10);
missionNumber2 = random.nextInt(10);
missionNumber3 = random.nextInt(10);
missionNumber4 = random.nextInt(10);
});
}
Future<void> MissionRetriever1() async{
await FirebaseFirestore.instance
.collection("quest")
.doc("1")
.get();
}
Future<void> MissionRetriever2() async{
return await FirebaseFirestore.instance
.collection("quest")
.doc(missionNumber2.toString())
.get();
}
Future<void> MissionRetriever3() async{
return await FirebaseFirestore.instance
.collection("quest")
.doc(missionNumber3.toString())
.get();
}
Future<void> MissionRetriever4() async{
return await FirebaseFirestore.instance
.collection("quest")
.doc(missionNumber4.toString())
.get();
}
}
在实践中,我需要在另一个文件中调用 MissionRetriever1 函数,然后使用 then 保存值,如下所示:
Future<void> getMission1() async{
return await widget.mservice.MissionRetriever2
.then((QuerySnapshot querySnapshot) => {
querySnapshot.docs.forEach((doc) {
print("Done");
setState(() {
MissionData1.add(doc["Name"]);
});
}),
});
}
但是这样做会给我一个错误:方法“then”没有为类型“Function”定义。
有什么建议吗?
【问题讨论】:
-
你不能
await和then在同一个组合中使用。您可以await并分配值,或者使用then并在未来发出事件时获得回调。 -
我已经尝试用 .then 删除函数中的等待,但错误仍然存在
-
它应该是
widget.mservice.MissionRetriever2()因为这是一个函数调用而不是实例成员。另外一个友好的建议是查看 dart 的命名约定,它们将使您的代码更具可读性。 -
非常感谢您提供的提高可读性的建议,如果我在调用小部件时添加 () 会出现这个问题,我会收到这个新错误:参数类型 'Set
Function(QuerySnapshot )' 不能分配给参数类型'FutureOr Function(void)'。
标签: flutter google-cloud-firestore flutter-layout flutter-dependencies flutter-test