您好,我是Flutter的新手,我在将文件写入Firestore时遇到问题。异步等待Firestore.instance似乎卡住了,使代码执行不断暂停。
当调用来自call_methods.dart的makeCall函数时,它被假定为获取作为参数接受的调用对象,并使用该对象来找出谁进行了调用以及谁是接收者,我使用用户ID来引用数据库中的用户,因此List receiversId变量是用户ID的列表,
makeCall函数应该在呼叫接收者列表中循环,并使用该呼叫填充每个接收者的呼叫集合。
以下是我的代码。任何人都可以帮助我吗?
Call.dart
import 'package:flutter/material.dart';
class Call {
String callerId;
String callerName;
String callerPic;
List<String> receiversId;
String channelId;
bool hasDialled;
Call(
{ @required this.callerId,
@required this.callerName,
@required this.callerPic,
@required this.receiversId,
@required this.channelId,
this.hasDialled});
Map<String,dynamic> toMap(Call call){
Map<String,dynamic> callMap=Map();
callMap['caller_id']=call.callerId;
callMap['caller_name']=call.callerName;
callMap['caller_pic']=call.callerPic;
callMap['receivers_id']=call.receiversId;
callMap['channel_id']=call.channelId;
callMap['has_dialled']=call.hasDialled;
return callMap;
}
Call.fromMap(Map callMap){
this.callerId=callMap['caller_id'];
this.callerName=callMap['caller_name'];
this.callerPic=callMap['caller_pic'];
this.receiversId=List<String>.from(callMap['receivers_id']);
this.channelId=callMap['channel_id'];
this.hasDialled=callMap['has_dialled'];
}
}
call_utilities.dart
import 'dart:math';
import 'package:first_app/models/call.dart';
import 'package:first_app/models/user.dart';
import 'package:first_app/resources/call_methods.dart';
import 'package:first_app/screens/callscreens/call_screen.dart';
import 'package:flutter/material.dart';
class CallUtils{
static final CallMethods callMethods =CallMethods();
static dial({@required User from,@required List<String> receivers,context}) async{
Call call =Call(
callerId:from.uid,
callerName:from.name,
callerPic:from.profilePhoto,
receiversId: receivers,
channelId: Random().nextInt(1000).toString(),
);
print('call has been dailed');
bool callMade=await callMethods.makeCall(call:call);
call.hasDialled=true;
if(callMade){
print(' the call returned ture we should be navigating somewhere ??');
Navigator.push(
context,
MaterialPageRoute(builder: (context)=>CallScreen(call: call)),
);
}
}
}
variables.dart
const USERS_COLLLECTION='users2';
const CALL_COLLECTION='Call';
call_methods.dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:first_app/constants/variables.dart';
import 'package:first_app/models/call.dart';
import 'package:flutter/material.dart';
class CallMethods {
static final Firestore firestore = Firestore.instance;
Stream<DocumentSnapshot> callStream({String uid}) => firestore
.collection(USERS_COLLLECTION)
.document(uid)
.collection(CALL_COLLECTION)
.document(uid)
.snapshots();
Future<bool> makeCall({Call call}) async {
try {
//for the caller
Map<String, dynamic> hasDailledMap = call.toMap(call);
call.hasDialled = true;
await firestore
.collection(USERS_COLLLECTION)
.document(call.callerId)
.collection(CALL_COLLECTION)
.document(call.callerId)
.setData(hasDailledMap);
// for the receivers
for (String id in call.receiversId) {
print(id);
Map<String, dynamic> hasNotDailledMap = call.toMap(call);
call.hasDialled = false;
await firestore
.collection(USERS_COLLLECTION)
.document(id)
.collection(CALL_COLLECTION)
.document(id)
.setData(hasNotDailledMap);
}
return true;
} catch (e) {
print(e);
return false;
}
}
Future<bool> endCall({@required Call call, @required String uid}) async {
try {
///delete my records
await firestore
.collection(USERS_COLLLECTION)
.document(uid)
.collection(CALL_COLLECTION)
.document(uid)
.delete();
if (call.hasDialled) {
//delete every ones records if i made the call
for (String id in call.receiversId) {
call.hasDialled = false;
await firestore
.collection(USERS_COLLLECTION)
.document(id)
.collection(CALL_COLLECTION)
.document(id)
.delete();
}
}
return true;
} catch (e) {
return false;
}
}
}