简体   繁体   中英

Flutter How to model any class instead of FutureBuilder?

I have a model and I want to use my services file to fill it from Firebase but I don't know how to do that?

I am filling it with FutureBuilder that's okey. But it is exhausting me.

Here is my model:

class ReviewModel {
  String? uid;
  String? userID;
  String? comment;
  dynamic rate;
  ReviewModel({
    this.uid,
    this.userID,
    this.comment,
    this.rate,
  });

  Map<String, dynamic> toMap() {
    return {
      'uid': uid,
      'userID': userID,
      'comment': comment,
      'rate': rate,
    };
  }

  factory ReviewModel.fromMap(Map<String, dynamic> map) {
    return ReviewModel(
      uid: map['uid'],
      userID: map['userID'],
      comment: map['comment'],
      rate: map['rate'],
    );
  }
  factory ReviewModel.fromDatabase(
      DocumentSnapshot snapshot, Map<String, dynamic> map) {
    return ReviewModel(
      uid: snapshot['uid'],
      userID: map['userID'],
      comment: map['comment'],
      rate: map['rate'],
    );
  }
   
}

Code is Following below,

Future<ReviewModel> getSalonReviews(String salonUID) async {
    CollectionReference aRef = FirebaseFirestore.instance
        .collection("salons")
        .doc(salonUID)
        .collection('bucket')
        .doc('reviewbox')
        .collection('reviews');
    dynamic _doc;
    var snapshot;
    try {
      await aRef.get().then((querySnapshot) => {
            for (var dummyDoc in querySnapshot.docs)
              {
                _doc = dummyDoc.data(),
                print(_doc),
              }
          });
      return ReviewModel.fromMap(_doc);
    } on FirebaseException catch (e) {
      Get.snackbar("Hata", e.code);
      rethrow;
    }
  }

This code is not returning my ReviewModel. Also I am using GetX and this is my GetX code:

  final Rx<ReviewModel> _reviewModel = ReviewModel().obs;
  ReviewModel get reviewModel => _reviewModel.value;
  set reviewModel(ReviewModel value) => _reviewModel.value;

Future fillReviewModel(String uid) async {
    SalonController.instance.reviewModel =
        await FakeService().getSalonReviews(uid);
  }

it return me this:

在此处输入图像描述

And this is my Firebase docs:

在此处输入图像描述

How do I achive my ReviewModel with Obx. If I try it, it returns null.

You don't have to return a model you'll do something like this in your prvoider file:

List _reviews = [];


List get reviews => [..._reviews];

// IN your future void function 
Future<void> myFunction () async{
myReviews = ...result of forEach;

// now update _reviews
_reviews = [...myReviews];
//And then notify listeners
notifylisteners;
    }

And then in your futurebuilder

    FutureBuilder(future: Provider.of<myClass>(context, listen:false).myFunction(),
    builder:(context, snapshot){


// check the state like the following
    if(snapshot.connectionState == ConnectionState.done){
     final myValues =  Provider.of<myClass>(context, listen:false).reviews;
...do something
return your_values}
    if(snapshot.connectionState == ConnectionState.waiting){return progressIndicator}
    })

 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM