Установите значение переключателя с помощью логического значения Firestore - PullRequest
0 голосов
/ 26 февраля 2020

Я создаю тестовое приложение, которое переключает логическое значение в Firestore. Мне нужно приложение, чтобы получить начальное значение переключателя из Firestore. С помощью моего метода я получаю ошибку типа «Будущее», а не подтип типа «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);
                  });
                })
          ],
        ),
      ),
    );
  }
}

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Используйте FutureBuilder. Кроме того, измените свой checkLEDStatus() тип возврата на Future<bool>.

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());
      }
    }
)
0 голосов
/ 26 февраля 2020

Виджет Switch имеет свойство value, которое принимает значение типа bool. В настоящее время в вашем коде вы возвращаете Future, и именно поэтому вы получаете эту ошибку. Это должно быть так:

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

Вы можете получить логическое значение из хранилища в initState и затем присвоить его свойству value. Затем, когда пользователь переключается внутри setState(), вызовите метод обновления и выполните isSwitched = newValue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...