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

如何从Firebase实时数据库读取传感器数据到Flutter并解决更新异常

解决Flutter读取Firebase实时数据库湿度值失败的问题

核心问题排查与修复步骤

1. 必须完成Firebase初始化

新版本Firebase Flutter SDK强制要求在使用任何Firebase服务前完成初始化。你代码中注释掉了firebase_core的导入与初始化逻辑,这是数据库连接失败的核心原因之一。

修复操作:

  • 在pubspec.yaml中添加firebase_core依赖:
dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^2.24.2
  firebase_database: ^10.4.2
  • 在应用入口添加初始化代码:
import 'package:firebase_core/firebase_core.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}

2. 检查数据库读取权限

若Firebase实时数据库规则设置为仅认证用户可读取,但你的应用未实现登录逻辑,会直接导致数据获取失败。

临时测试规则(仅开发环境使用):
进入Firebase控制台→实时数据库→规则,将规则修改为:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

注意:上线前必须替换为安全规则,比如限制特定用户或IP访问。

3. 确认节点路径完全匹配

数据库节点路径区分大小写,需确保代码中的路径与Firebase控制台的实际节点名称完全一致:

// 核对Firebase中节点名称是'Sensor'还是'sensor',严格匹配大小写
DatabaseReference databaseReference =
    FirebaseDatabase.instance.ref().child('Sensor').child('Humidity');

4. 优化监听逻辑与调试

在监听中添加错误捕获,便于排查连接或数据异常:

databaseReference.onValue.listen((DatabaseEvent event) {
  final data = event.snapshot.value;
  if (kDebugMode) {
    print('快照是否存在: ${event.snapshot.exists}');
    print('获取到的数据: $data');
  }
  if (data != null) {
    setState(() {
      humidity = data.toString();
    });
  } else {
    setState(() {
      humidity = '69';
    });
  }
}, onError: (error) {
  if (kDebugMode) {
    print('数据库监听错误: $error');
  }
});

5. 验证依赖版本兼容性

确保firebase_database与firebase_core使用最新稳定版本,避免版本不兼容导致的异常。

完整修复后的代码示例

// ignore_for_file: camel_case_types, use_build_context_synchronously, unnecessary_null_comparison

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_database/firebase_database.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: const homePage(),
    );
  }
}

class homePage extends StatefulWidget {
  const homePage({super.key});

  @override
  State<homePage> createState() => _HomePageState();
}

class _HomePageState extends State<homePage> {
  List<double> humidityReadings = [];
  String humidity = '68';

  @override
  void initState() {
    super.initState();
    fetchHumidityReadings();
    if (kDebugMode) {
      print('fetchHumidityReadings() executed');
    }
  }

  void fetchHumidityReadings() {
    if (kDebugMode) {
      print('Inside fetchHumidityReadings()');
    }
    DatabaseReference databaseReference =
        FirebaseDatabase.instance.ref().child('Sensor').child('Humidity');
    databaseReference.onValue.listen((DatabaseEvent event) {
      final data = event.snapshot.value;
      if (kDebugMode) {
        print('快照是否存在: ${event.snapshot.exists}');
        print('Fetched data: $data');
      }
      if (data != null) {
        setState(() {
          humidity = data.toString();
        });
      } else {
        if (kDebugMode) {
          print('No data fetched');
        }
        setState(() {
          humidity = '69';
        });
      }
    }, onError: (error) {
      if (kDebugMode) {
        print('数据库监听错误: $error');
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: const Text(
          "LetsGrow",
          style: TextStyle(
              color: Color.fromRGBO(12, 192, 223, 1.0),
              fontWeight: FontWeight.bold),
        ),
        backgroundColor: Colors.white,
        shadowColor: const Color.fromARGB(255, 95, 94, 94),
      ),
      backgroundColor: const Color(0xffeeeeee),
      body: SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            const SizedBox(height: 10),
            Container(
              padding: const EdgeInsets.fromLTRB(20, 20, 20, 10),
              alignment: Alignment.center,
              child: const Text(
                'Sensor Readings',
                style: TextStyle(
                  fontSize: 35,
                  fontFamily: 'RobotoBold',
                  color: Colors.black,
                ),
                textAlign: TextAlign.center,
              ),
            ),
            Container(
              padding: const EdgeInsets.fromLTRB(20, 20, 20, 10),
              alignment: Alignment.center,
              child: Text(
                'Humidity: $humidity',
                style: const TextStyle(
                  fontSize: 35,
                  fontFamily: 'RobotoBold',
                  color: Colors.black,
                ),
                textAlign: TextAlign.center,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:12:52