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
相关产品推荐
相关产品推荐

