RatingBar 始终在 flutter firestore 中保存相同的值

问题描述 投票:0回答:1

我每次发送评分,无论是1、2、3、4还是5,都会以5的值存储在数据库中。我做了很多尝试都无济于事。请帮忙。

这是我的代码 三个页面负责发送该值 第一页将值发送到第二页上的函数,第二页将值发送到第三页上的函数以将其发送到数据库。

首页=>评论

import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';

import 'package:get/get.dart';
import 'package:hallo_doctor_client/app/modules/widgets/submit_button.dart';

import '../controllers/review_controller.dart';

class ReviewView extends GetView<ReviewController> {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
      child: Scaffold(
        appBar: AppBar(
          title: Text('Review Doctor'.tr),
          centerTitle: true,
        ),
        body: SingleChildScrollView(
          child: Container(
            width: double.infinity,
            padding: EdgeInsets.all(10),
            child: Card(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  ListTile(
                    leading: CircleAvatar(
                      radius: 40,
                      backgroundImage: CachedNetworkImageProvider(
                          controller.timeSlot.doctor!.doctorPicture!),
                    ),
                    title: Text(controller.timeSlot.doctor!.doctorName!),
                  ),
                  Divider(),
                  TextField(
                    controller: controller.textEditingReviewController,
                    decoration: InputDecoration(
                        border: OutlineInputBorder(),
                        hintText: 'Your Review'.tr),
                    maxLines: 10,
                    textInputAction: TextInputAction.done,
                    onSubmitted: (value) => controller.review = value,
                  ),
                  Divider(),
                  Obx(() => RatingBar.builder(
                        initialRating: controller.rating.value,
                        minRating: 1,
                        direction: Axis.horizontal,
                        allowHalfRating: true,
                        itemCount: 5,
                        itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
                        itemBuilder: (context, _) => Icon(
                          Icons.star,
                          color: Colors.amber,
                        ),
                        onRatingUpdate: (rating) {
                          FocusManager.instance.primaryFocus?.unfocus();
                          print(rating);
                        },
                      )),
                  SizedBox(
                    height: 50,
                  ),
                  SubmitButton(
                      onTap: () {
                        controller.saveReiew();
                      },
                      text: "Send".tr)
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

请关注那个小部件,因为他负责

                  Obx(() => RatingBar.builder(
                        initialRating: controller.rating.value,
                        minRating: 1,
                        direction: Axis.horizontal,
                        allowHalfRating: true,
                        itemCount: 5,
                        itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
                        itemBuilder: (context, _) => Icon(
                          Icons.star,
                          color: Colors.amber,
                        ),
                        onRatingUpdate: (rating) {
                          FocusManager.instance.primaryFocus?.unfocus();
                          print(rating);
                        },
                      )),

第二页=>控制器

import 'package:flutter/cupertino.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:get/get.dart';
import 'package:hallo_doctor_client/app/models/time_slot_model.dart';
import 'package:hallo_doctor_client/app/service/review_service.dart';
import 'package:hallo_doctor_client/app/service/user_service.dart';

class ReviewController extends GetxController {
  //TODO: Implement ReviewController

  var review = '';
  var rating = 5.0.obs;
  TextEditingController textEditingReviewController = TextEditingController();
  TimeSlot timeSlot = Get.arguments;
  var price = 0.obs;
  var ratings = '';
  @override
  void onInit() {
    super.onInit();
    price.value = timeSlot.price!;
  }

  @override
  void onClose() {}
  void saveReiew() async {
    EasyLoading.show(maskType: EasyLoadingMaskType.black);
    var user = UserService().currentUserFirebase;
    try {
      await ReviewService().saveReview(textEditingReviewController.text,
          rating.value.toInt(), timeSlot, user!);
      Get.close(2);
      //Get.back();
    } catch (e) {
      Fluttertoast.showToast(msg: e.toString());
    } finally {
      EasyLoading.dismiss();
    }
  }
}

第三页服务=>将值发送到数据库

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:hallo_doctor_client/app/models/doctor_model.dart';
import 'package:hallo_doctor_client/app/models/review_model.dart';
import 'package:hallo_doctor_client/app/models/time_slot_model.dart';
import 'package:hallo_doctor_client/app/service/user_service.dart';

class ReviewService {
  Future saveReview(
      String review, int rating, TimeSlot timeSlot, User user) async {
    try {
      await FirebaseFirestore.instance
          .collection('Review')
          .doc(timeSlot.timeSlotId)
          .set({
        'review': review,
        'rating': rating,
        'timeSlotId': timeSlot.timeSlotId,
        'userId': UserService().currentUserFirebase!.uid,
        'doctorId': timeSlot.doctorid,
        'user': {
          'displayName': UserService().currentUserFirebase!.displayName,
          'photoUrl': UserService().getProfilePicture(),
        }
      });


    } catch (e) {
      return Future.error(e.toString());
    }
  }

  Future<List<ReviewModel>> getDoctorReview(
      {required Doctor doctor, int limit = 4}) async {
    try {
      var reviewRef = await FirebaseFirestore.instance
          .collection('Review')
          .where('doctorId', isEqualTo: doctor.doctorId)
          .limit(limit)
          .get();
      List<ReviewModel> listReview = reviewRef.docs.map((doc) {
        var data = doc.data();
        data['reviewId'] = doc.reference.id;
        ReviewModel review = ReviewModel.fromMap(data);
        return review;
      }).toList();
      return listReview;
    } catch (e) {
      return Future.error(e.toString());
    }
  }
}

flutter dart ratingbar
1个回答
0
投票

您没有更新控制器中的“评级”变量

onRatingUpdate: (rating) {
                      controller.rating = rating
                      FocusManager.instance.primaryFocus?.unfocus();
                      print(rating);
                    },
© www.soinside.com 2019 - 2024. All rights reserved.