Firebase 使用Firestore布尔值设置开关的值

Firebase 使用Firestore布尔值设置开关的值,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,我正在制作一个在Firestore中切换布尔值的测试应用程序。我需要应用程序从Firestore检索开关的初始值。通过我的方法,我得到错误类型“Future”不是类型“bool”的子类型。布尔值称为LEDOn。这是我的应用程序: import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; void main() => runApp(MyApp()); cla

我正在制作一个在Firestore中切换布尔值的测试应用程序。我需要应用程序从Firestore检索开关的初始值。通过我的方法,我得到错误类型“Future”不是类型“bool”的子类型。布尔值称为LEDOn。这是我的应用程序:

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {
  final db = Firestore.instance;

  void updateLED(bool newValue) async {
    await db
        .collection('LEDStatus')
        .document('LEDStatus')
        .updateData({'LEDOn': newValue});
  }

  Future<dynamic> checkLEDStatus() async {
    DocumentSnapshot snapshot =
        await db.collection('LEDStatus').document('LEDStatus').get();
    return snapshot.data['LEDOn'];
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(brightness: Brightness.dark),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Thingspeak'),
        ),
        body: Column(
          children: <Widget>[
            Switch(
                value: checkLEDStatus(),
                onChanged: (bool newValue) {
                  setState(() {
                    print(newValue);
                    updateLED(newValue);
                  });
                })
          ],
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“包:cloud_firestore/cloud_firestore.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了StatefulWidget{
@凌驾
状态createState(){
返回_MyAppState();
}
}
类MyAppState扩展了状态{
final db=Firestore.instance;
void updateLED(bool newValue)异步{
等待数据库
.collection('LEDStatus')
.文件('LEDStatus')
.updateData({'LEDOn':newValue});
}
Future checkLEDStatus()异步{
文档快照快照=
等待db.collection('LEDStatus')。document('LEDStatus')。get();
返回snapshot.data['LEDOn'];
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:主题数据(亮度:亮度.暗),
家:脚手架(
appBar:appBar(
标题:文本(“Thingspeak”),
),
正文:专栏(
儿童:[
开关(
值:checkLEDStatus(),
一旦更改:(bool newValue){
设置状态(){
打印(新值);
更新(newValue);
});
})
],
),
),
);
}
}

开关
小部件具有属性
,该属性的值类型为
bool
。当前在代码中,您返回的是一个
Future
,这就是为什么会出现该错误。应该是这样的:

Switch(
  value: isSwitched,
  onChanged: (value) {
    setState(() {
      isSwitched = value;
    });
  },


您可以从
initState
中的firestore中检索布尔值,然后将其分配给属性
。然后,当用户在
setState()
内部切换时,调用更新方法并执行
isSwitched=newValue

时,
Switch
小部件具有属性
value
,该属性的值为
bool
类型。当前在代码中,您返回的是一个
Future
,这就是为什么会出现该错误。应该是这样的:

Switch(
  value: isSwitched,
  onChanged: (value) {
    setState(() {
      isSwitched = value;
    });
  },


您可以从
initState
中的firestore中检索布尔值,然后将其分配给属性
。然后,当用户在
setState()
内切换时,调用更新方法并执行
isSwitched=newValue

使用FutureBuilder。另外,将您的
checkLEDStatus()
返回类型更改为
Future


使用FutureBuilder。另外,将您的
checkLEDStatus()
返回类型更改为
Future