Flutter+Firebase每日限收15条预约次日失效问题求助
Flutter预约每日限制问题修复方案
你的代码存在三个核心问题导致次日仍弹出预约已满提示:
getCount()方法统计的是所有历史预约总数,不是当日预约数,次日总数仍会超过15Appointment类的静态Date变量只会在类初始化时赋值一次,不会随日期更新_HosState中的today变量是组件初始化时的日期,过零点后不会自动刷新
修复后的完整代码
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(const MaterialApp( home: Hos(), )); } class Hos extends StatefulWidget { const Hos({Key? key}) : super(key: key); @override State<Hos> createState() => _HosState(); } class _HosState extends State<Hos> { TextEditingController name = TextEditingController(); TextEditingController number= TextEditingController(); final FirebaseFirestore db = FirebaseFirestore.instance; final snackBar = const SnackBar( content: Text('今日预约已满'), ); // 实时获取当日0点日期 DateTime get today => DateTime.now().copyWith( hour: 0, minute: 0, second: 0, millisecond: 0, microsecond: 0 ); @override Widget build(BuildContext context) { return Scaffold( floatingActionButton: FloatingActionButton( onPressed: () async{ int todayCount = await Appointment.getTodayCount(today); if(todayCount < 15){ await Appointment.add(name.text, number.text, today); name.clear(); number.clear(); }else{ ScaffoldMessenger.of(context).showSnackBar(snackBar); name.clear(); number.clear(); } }, child: const Icon(Icons.app_registration), ), body: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( padding: const EdgeInsets.all(15), child: TextField( controller: name, decoration: const InputDecoration( border: OutlineInputBorder(), labelText: '姓名', hintText: '输入姓名', ), ), ), Padding( padding: const EdgeInsets.all(15), child: TextField( controller: number, keyboardType: TextInputType.number, inputFormatters: [FilteringTextInputFormatter.digitsOnly] , decoration: const InputDecoration( border: OutlineInputBorder(), labelText: '电话', hintText: '输入电话号码', ), ), ), ], ), ); } } class Appointment { String Name; int Number; DateTime Date; Appointment({ required this.Name, required this.Number, required this.Date, }); Map<String, dynamic> tomap() { return { "Name": Name, "Number": Number, "Date": Timestamp.fromDate(Date) }; } static Future add(String name, String number, DateTime date) async{ final FirebaseFirestore db = FirebaseFirestore.instance; var users = db.collection("Appointments"); await users.add(Appointment( Name: name, Number: int.parse(number), Date: date, ).tomap()); } // 统计当日预约数 static Future<int> getTodayCount(DateTime today) async { final FirebaseFirestore db = FirebaseFirestore.instance; DateTime startOfDay = today; DateTime endOfDay = today.copyWith(hour: 23, minute: 59, second: 59); final querySnapshot = await db .collection('Appointments') .where('Date', isGreaterThanOrEqualTo: Timestamp.fromDate(startOfDay)) .where('Date', isLessThanOrEqualTo: Timestamp.fromDate(endOfDay)) .get(); return querySnapshot.size; } }
关键修改说明
- 当日预约统计:
getTodayCount()通过Firestore的where条件过滤当日记录,只统计当天数据 - 实时日期获取:用
get todaygetter方法,每次调用返回当前0点日期,过零点自动更新 - 移除静态日期:
Appointment的Date改为实例变量,添加预约时传入当日日期,避免固化 - 日期存储优化:将
DateTime转为Firestore支持的Timestamp类型,避免格式兼容问题 - 逻辑修正:直接判断当日预约数是否小于15,逻辑更准确
内容的提问来源于stack exchange,提问作者MOBILES RECOVERY
相关产品推荐
相关产品推荐

