firebase - 使用交换机 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();
}
});
},
),
],
)),
);
}
}
解决方案
你应该这样做:
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;
});
}
推荐阅读
- javascript - 如何清理cheerio请求的结果?
- python-3.x - GradientTape 丢失变量的轨迹
- java - 注册页面 else/if
- reactjs - Antd中使用数组对象分组复选框
- python - 当我从 Python 将数据导出到 csv 时,该文件是空白的。当我使用 Print 函数查看数据时,返回第一个字符串
- path - SwiftUI 中 Path.addArc 的顺时针方向错了吗?
- swift - 未知的 116 字节 ECDSA 私钥格式
- python - 我可以将循环的结果保存到列表中(Python)吗?
- ios - 如何正确格式化单元格?
- nix - 如何禁用解压阶段以防止出现“不知道如何解压源存档”错误?