【发布时间】:2020-07-10 17:29:43
【问题描述】:
我正在尝试实现一个开关,该开关使用以下键读取和写入我的 firestore 中的 bool 值 设备/Device1/LED_STATUS/DATA
当我运行 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();
}
});
},
),
],
)),
);
}
}
【问题讨论】:
标签: firebase flutter firebase-realtime-database switch-statement