首页 > 解决方案 > Flutter Switch 使用 realtimeDB Firebase 控制 Relay

问题描述

我正在尝试创建一个sonoff(https://sonoff.tech/)类型的设备,它基本上通过连接到服务器(在我的情况下为Firebase Realtime)来打开和关闭继电器,对于我正在尝试实现的交换机aa Flutter Switch 应用程序上的开关,该开关读取服务器上布尔值的状态并更新 onchanged 中的布尔值!我的服务器端已准备就绪,即使我的测试切换工作成功,只是我无法成功实现切换。Firebase 示例

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';


class SwitchPage extends StatefulWidget {
  static const String id = 'switch_screen';

  @override
  _SwitchPageState createState() => _SwitchPageState();
}

class _SwitchPageState extends State<SwitchPage> {
  final DBref = FirebaseDatabase.instance.reference();

  bool isSwitched;
  bool newVal;


  void LedOn() async {
    await DBref.child("DHT11")
        .child("Device1")
        .child("LED_STATUS")
        .update({'DATA': 'TRUE'});
  }

  void LedOFF() async {
    await DBref.child("DHT11")
        .child("Device1")
        .child("LED_STATUS")
        .update({'DATA': 'FALSE'});
  }

  void getStatus() async {
    String newValue = (await FirebaseDatabase.instance
            .reference()
            .child("DHT11/Device1/LED_STATUS/DATA")
            .once())
        .value;
    print(isSwitched);
    print(newValue);
    setState(() {
      if (newValue == 'TRUE') {
        isSwitched = true;
      } else {
        isSwitched = false;
      }
    });
  }


  @override
  void initState() {
    getStatus(); 
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
          appBar: AppBar(
            title: Text('Device Center'),
          ),
          backgroundColor: Colors.white,
          body: Column(
            children: <Widget>[
              FlatButton(
                  onPressed: () async {
                    await getStatus();
                  },
                  child: Text('TEST STATUS')),
              FlatButton(
                  onPressed: () {
                    LedOn();
                    print('ON');
                  },
                  child: Text('LED ON')),
              FlatButton(
                  onPressed: () {
                    LedOFF();
                    print('OFF');
                  },
                  child: Text('LED OFF')),
              Switch(
                value: isSwitched,
                onChanged: (value) {
                  setState(() {
                    isSwitched = value;
                    if (isSwitched == "TRUE") {
                      return LedOFF();
                    } else if (isSwitched == "FALSE") {
                      return LedOn();
                    }
                  });
                },
              ),
            ],
          )),
    );
  }
}

标签: firebaseflutterfirebase-realtime-database

解决方案


推荐阅读