【问题标题】:Set value of a switch with Firestore boolean使用 Firestore 布尔值设置开关的值
【发布时间】:2020-06-09 17:59:48
【问题描述】:

我正在制作一个在 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);
                  });
                })
          ],
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

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

    FutureBuilder(
        future: checkLEDStatus(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            bool result = snapshot.data;
            return Switch(value: result, onChanged: (bool newVal) {
              setState(() => result = newVal);
              updateLED(newVal);
            });
          } else {
            return Center(child: CircularProgressIndicator());
          }
        }
    )
    

    【讨论】:

      【解决方案2】:

      Switch 小部件具有value 属性,该属性采用bool 类型的值。目前在您的代码中,您正在返回 Future,这就是您收到该错误的原因。应该是这样的:

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

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

      【讨论】:

        猜你喜欢
        • 2020-09-10
        • 2017-07-14
        • 1970-01-01
        • 2020-06-23
        • 1970-01-01
        • 2020-06-17
        • 2013-05-15
        • 1970-01-01
        • 2014-12-12
        相关资源
        最近更新 更多