为咖啡馆应用程序添加评分功能的
为了允许用户对餐馆进行评分,需要使用Flutter中的Cloud Firestore - 一个云存储解决方案。在Firestore中创建一个'cafe'集合,并在该集合中创建一个'documents'文件夹,用于存储和检索餐馆的详细信息和评分。
首先,需要在应用程序中创建一个'cafe'类,其中包含餐馆的名称、位置、描述等信息,以及最新的评分数组:
class Cafe {
String name;
String location;
String description;
List ratings;
Cafe({this.name, this.location, this.description, this.ratings});
factory Cafe.fromFirestore(DocumentSnapshot snapshot) {
return Cafe(
name: snapshot.data["name"],
location: snapshot.data["location"],
description: snapshot.data["description"],
ratings: List.from(snapshot.data["ratings"]),
);
}
Map toFirestore() {
return {
"name": name,
"location": location,
"description": description,
"ratings": ratings,
};
}
}
接下来,创建一个'RateCafe' widget,用于显示可以评分的餐馆列表。在此widget中,使用Firestore进行数据获取、添加和更新操作。
class RateCafe extends StatefulWidget {
@override
_RateCafeState createState() => _RateCafeState();
}
class _RateCafeState extends State {
final GlobalKey _formKey = GlobalKey();
final TextEditingController _ratingController = TextEditingController();
List cafes = [];
final _firestore = Firestore.instance;
@override
void initState() {
super.initState();
// 获取餐馆列表
_getListOfCafes();
}
void _getListOfCafes() async {
QuerySnapshot snapshot =
await _firestore.collection("cafes").getDocuments();
setState(() {
cafes = snapshot.documents
.map((doc) => Cafe.fromFirestore(doc))
.toList();
});
}
void _addRating(int index) async {
Cafe cafe = cafes[index];
double rating = double.parse(_ratingController.text);
cafe.ratings.add(rating);
await _firestore
.collection("cafes")
.document(index.toString())
.setData(cafe.toFirestore());
setState(() {});
_ratingController.clear();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("评分餐馆"),
),
body: SingleChildScrollView(
child: Column(
children: cafes
.asMap()
.entries
.map(
(entry) => ListTile(
title: Text(entry.value.name),
subtitle: Text(entry.value.description),
trailing: Form(
key: _formKey,
child: Column(
children: [
TextFormField(
controller: _ratingController,
keyboardType: TextInputType.numberWithOptions(
decimal: true, signed: false),
decoration: InputDecoration(
labelText: "您的评分",
),
validator: (value) {
if (value.isEmpty) {
return "评分不能为空";
}
if (double.parse(value) < 0