You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter+Firebase每日限收15条预约次日失效问题求助

Flutter预约每日限制问题修复方案

你的代码存在三个核心问题导致次日仍弹出预约已满提示:

  • getCount()方法统计的是所有历史预约总数,不是当日预约数,次日总数仍会超过15
  • Appointment类的静态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 today getter方法,每次调用返回当前0点日期,过零点自动更新
  • 移除静态日期:Appointment的Date改为实例变量,添加预约时传入当日日期,避免固化
  • 日期存储优化:将DateTime转为Firestore支持的Timestamp类型,避免格式兼容问题
  • 逻辑修正:直接判断当日预约数是否小于15,逻辑更准确

内容的提问来源于stack exchange,提问作者MOBILES RECOVERY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:15:32