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

求助:Flutter实时数据库开关及相关按钮实现(新手)

实现Flutter实时数据库开关按钮功能

1. 基础配置

  • 在pubspec.yaml中添加依赖:
    dependencies:
      flutter:
        sdk: flutter
      firebase_core: ^2.15.0
      firebase_database: ^10.2.0
    
  • 执行flutter pub get安装依赖
  • 完成Firebase项目配置:Android端将google-services.json放到android/app目录;iOS端将GoogleService-Info.plist添加到Xcode项目中

2. 核心代码实现

创建一个StatefulWidget,结合StreamBuilder监听实时数据库数据,用Switch组件实现开关交互:

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 SwitchDatabaseScreen(),
    );
  }
}

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

  @override
  State<SwitchDatabaseScreen> createState() => _SwitchDatabaseScreenState();
}

class _SwitchDatabaseScreenState extends State<SwitchDatabaseScreen> {
  // 自定义数据库节点路径,可根据需求修改
  final DatabaseReference _switchRef = FirebaseDatabase.instance.ref('device/switchState');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('实时开关控制')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            StreamBuilder(
              // 监听数据库节点的实时变化
              stream: _switchRef.onValue,
              builder: (context, snapshot) {
                if (snapshot.hasData && snapshot.data!.snapshot.value != null) {
                  bool isSwitched = snapshot.data!.snapshot.value as bool;
                  return Switch(
                    value: isSwitched,
                    onChanged: (value) {
                      // 更新数据库中的开关状态
                      _switchRef.set(value);
                    },
                    activeColor: Colors.green,
                  );
                }
                // 数据加载中或为空时显示加载组件
                return const CircularProgressIndicator();
              },
            ),
            // 可选:添加按钮控制开关
            const SizedBox(height: 30),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                ElevatedButton(
                  onPressed: () => _switchRef.set(true),
                  child: const Text('打开'),
                ),
                const SizedBox(width: 20),
                ElevatedButton(
                  onPressed: () => _switchRef.set(false),
                  child: const Text('关闭'),
                ),
              ],
            )
          ],
        ),
      ),
    );
  }
}

3. 数据库规则配置(重要)

测试阶段可先设置宽松规则(上线前务必修改为安全规则):

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

关键说明

  • StreamBuilder会自动监听数据库节点变化,数据更新时UI同步刷新
  • 必须确保Firebase初始化完成(await Firebase.initializeApp()),否则会触发初始化错误
  • 上线前一定要调整数据库规则,通过用户认证或节点权限限制读写,防止数据泄露

内容的提问来源于stack exchange,提问作者Francis Akwasi Agyemang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:15:34