异步等待卡在Flutter Firebase中

时间:2020-05-23 20:09:17

标签: firebase flutter dart google-cloud-firestore

您好,我是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;
    }
  }
}

0 个答案:

没有答案