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

Flutter从Firebase Firestore获取数值与本地版本号比较报错如何解决

问题修复方案

错误根因

报错是因为对Firestore DocumentSnapshot 的API使用错误:

  • snapshot.data 本身是返回Map<String, dynamic>?的方法,不是文档数据本身,你直接把这个方法赋值给了newest_version_from_firebase变量,后续用这个方法对象和数字做大小比较,自然会触发方法调用不匹配的报错。
  • 就算调用了data()方法,拿到的是整个文档的键值对集合,你还需要从中取出定义的newest_v_app字段才能做版本比对。

修复后的完整代码

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class UpdatePage extends StatefulWidget {
  @override
  _UpdatePageState createState() => _UpdatePageState();
}

class _UpdatePageState extends State<UpdatePage> {
  bool updateAvailable = false;
  // 本地当前版本号
  final num currentVersion = 7;
  // 存储从Firebase拿到的最新版本号
  num? newestVersionFromFirebase;

  Future<void> _getUpdateAvailable() async {
    final DocumentReference document = FirebaseFirestore.instance.collection('system').doc('update');
    print('Success GetUpdate 1');
    try {
      final DocumentSnapshot snapshot = await document.get();
      if (snapshot.exists) {
        // 先调用data()方法拿到文档数据Map,再取出对应字段转成num类型
        final Map<String, dynamic> docData = snapshot.data() as Map<String, dynamic>;
        setState(() {
          newestVersionFromFirebase = docData['newest_v_app'] as num;
        });
        print('Success GetUpdate 2, 远程版本号: $newestVersionFromFirebase');
        compareUpdate();
        print('Success GetUpdate 3');
        testUpdateComparer();
      }
    } catch (e) {
      print('获取版本信息失败: $e');
    }
  }

  void compareUpdate() {
    // 先判空避免空异常
    if (newestVersionFromFirebase != null && newestVersionFromFirebase! > currentVersion) {
      setState(() {
        updateAvailable = true;
      });
    } else {
      setState(() {
        updateAvailable = false;
      });
    }
  }

  void testUpdateComparer() {
    if (updateAvailable) {
      print('Success AvailableBool');
    } else {
      print('No AvailableBool');
    }
  }

  @override
  void initState() {
    super.initState();
    print('Success Init');
    _getUpdateAvailable();
  }

  @override
  Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
    ]);
    return Scaffold(
      // 可根据updateAvailable的值自定义更新提示UI
      body: Center(
        child: updateAvailable 
            ? const Text('发现新版本,请更新')
            : const Text('当前已是最新版本'),
      ),
    );
  }
}

额外优化说明

  • 变量命名统一改为Dart推荐的小驼峰格式,符合开发规范
  • 新增文档存在性判断、异常捕获、空安全校验,避免空值引发的其他崩溃
  • 移除了方法中不必要的BuildContext参数,若后续需要在方法内弹框、跳转路由可再加回

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:09:00