首页 > 解决方案 > 使用交换机 Flutter 实时数据库

问题描述

我正在尝试实现一个开关,该开关使用以下键 Device/Device1/LED_STATUS/DATA 在我的 Firestore 中读取和写入 bool 值

当我运行 getStatus 时,该值打印 null 然后给出该值。小部件在函数能够给出值之前构建,因此会给出空断言异常并崩溃。我尝试了许多方法试图将 initState 设置为 setState 但没有用。

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;

  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'});
  }

  Future<bool> getStatus() async {
    bool isSwitched = (await FirebaseDatabase.instance
            .reference()
            .child("DHT11/Device1/LED_STATUS/DATA")
            .once())
        .value;
    print(isSwitched);
    return isSwitched;
  }

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

            ],
          )),
    );
  }
}

建议后更新

我尝试了我的 TEST 按钮工作正常的建议方式,他们正在更新 firebase 数据库,但我无法实现 Switch!请帮忙!

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-databaseswitch-statement

解决方案


你应该这样做:

  Widget _createSwitch(){
    if(isSwitched==null)
      return Center();
    return  Switch(
      value: isSwitched,
      onChanged: (value) {
        if (isSwitched == 'TRUE') {
          return LedOFF();
        } else {
          LedOn();
        }
      },
    );
  }

并将 getStatus 更改为:

  void getStatus() async {
    bool mswitch = (await FirebaseDatabase.instance
            .reference()
            .child("DHT11/Device1/LED_STATUS/DATA")
            .once())
        .value;
    print(mswitch);
      setState(() {
         isSwitched=mswitch;
       });
  }

推荐阅读