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

多设备下生成连续递增唯一报告编号的Flutter实现问题

跨设备连续递增编号的解决方案

你的核心问题是SharedPreferences完全不适合做跨设备的计数器维护——它是本地存储,仅单设备生效,这就是不同设备都从1开始计数的原因。下面是基于你正在使用的Firebase的正确实现方案:

为什么不能用SharedPreferences?

SharedPreferences是单设备本地的键值存储,数据完全不与其他设备同步,而且APP重启后如果没有持久化内存变量,计数器还会重置,完全满足不了跨设备连续编号的需求。

正确实现思路(基于Firebase)

必须把计数器放在云端,用Firebase的原子操作保证并发下不会出现重复编号,推荐两种方案:

方案1:Firebase Realtime Database 事务操作

这是最可靠的方式,事务能确保多设备同时请求时不会生成重复编号:

  • 在Realtime Database中创建节点counter/reportNumber,初始值设为0
  • 点击生成按钮时,发起事务读取当前值并原子递增,返回新编号给前端
  • 只有当云端的值和读取时一致,才会完成更新,避免冲突

方案2:Firebase Firestore 原子递增

如果用Firestore,可单独创建counters集合,里面存reportSequence文档,字段currentNumber初始值为0:

  • 生成编号时用FieldValue.increment(1)原子性递增字段,同时获取递增后的值作为用户编号
  • 同样能避免跨设备重复问题

代码修改示例(Realtime Database版本)

先确保已集成Firebase Realtime Database依赖,然后修改按钮逻辑:

import 'package:firebase_database/firebase_database.dart';

// 定义云端计数器引用
final DatabaseReference _counterRef = FirebaseDatabase.instance.ref('counter/reportNumber');

// 生成编号按钮的onPressed逻辑
onPressed: () {
  _counterRef.runTransaction((mutableData) async {
    int currentValue = mutableData.value ?? 0;
    int newNumber = currentValue + 1;
    mutableData.value = newNumber;
    return Transaction.success(mutableData);
  }).then((result) {
    if (result.committed) {
      setState(() {
        _counter = result.dataSnapshot.value as int;
        _controller.text = _counter.toString();
      });
      // 15分钟未保存清空输入框(如需释放编号需额外处理云端状态)
      Timer(Duration(seconds: 15), () {
        setState(() {
          _controller.text = '';
        });
        // 可选:若要释放未使用的编号,需在云端记录预占信息,定时清理后递减计数器
      });
    }
  }).catchError((error) {
    print('生成编号失败:$error');
  });
},

保存按钮逻辑简化,无需再维护本地计数器:

onPressed: () {
  if (_formKey.currentState.validate()) {
    if (_connectionStatus.toString() == 'ConnectivityResult.none') {
      _showToastNoConnectionToInternet();
    } else {
      uploadInfoToFirebase();
      // 云端计数器已在生成时更新,无需本地操作
    }
  }
},

原代码的问题总结

  1. _mainCounter是内存变量,APP重启后会重置
  2. 即便用SharedPreferences,也只能在单设备生效,无法跨设备同步计数器状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:01:00