【问题标题】:How to see changes in flutter app when changing values in Firebase Realtime Database?更改 Firebase 实时数据库中的值时如何查看 Flutter 应用程序的更改?
【发布时间】:2020-07-11 11:57:59
【问题描述】:

每当我对 Firebase 实时数据库进行任何更改时,我都会尝试让这些滚动开关更改其值。

更具体地说,每当我将 Relay1/Data 的值更改为 0 时,我都希望该开关变为非活动状态。

我到处都试过了,但我找不到任何解决方案。

  bool relay1pressed;
  final databaseReferenceTest = FirebaseDatabase.instance.reference();



@override
  void initState() {
    super.initState();

    databaseReferenceTest
        .child('MedicalCenter')
        .once()
        .then((DataSnapshot snapshot) {
      String value = snapshot.value['Relay1']['Data'];
      print('Value is $value');
      if (value == '1') {
        relay1pressed = true;
      } else
        relay1pressed = false;

      setState(() {
        isLoading = true;
      });
    });
  }

  
//Widget build

            StreamBuilder(
              stream: databaseReferenceTest
                  .child('MedicalCenter')
                  .child('Relay1')
                  .onValue,
              builder: (BuildContext context, AsyncSnapshot<Event> snapshot) {
                databaseReferenceTest
                    .child('MedicalCenter')
                    .once()
                    .then((DataSnapshot snapshot) {
                  String value = snapshot.value['Relay1']['Data'];
                  print('Value is $value');
                  if (value == '1') {
                    relay1pressed = true;
                    print('relay1 bool $relay2pressed');
                  } else {
                    relay1pressed = false;
                    print('relay1 bool $relay2pressed');
                  }
                });

                return LiteRollingSwitch(
                  value: relay1pressed,
                  textOn: 'active',
                  textOff: 'inactive',
                  colorOn: Colors.deepOrange,
                  colorOff: Colors.blueGrey,
                  iconOn: Icons.lightbulb_outline,
                  iconOff: Icons.power_settings_new,
                  onChanged: (bool state) {
                    state
                        ? databaseReferenceTest
                            .child('MedicalCenter')
                            .update({'Relay1/Data': '1'})
                        : databaseReferenceTest
                            .child('MedicalCenter')
                            .update({'Relay1/Data': '0'});
           

【问题讨论】:

    标签: firebase flutter firebase-realtime-database real-time stream-builder


    【解决方案1】:

    您当前正在使用once() 从数据库中获取值,这意味着它只读取当前值。如果您想继续监控该值,您需要使用onValue

    databaseReferenceTest
        .child('MedicalCenter')
        .onValue.listen((event) {
          var snapshot = event.snapshot
    
          String value = snapshot.value['Relay1']['Data'];
          print('Value is $value');
    
          ...
    
        });
    

    【讨论】:

    • 非常感谢 Puf 的回复! :) 它确实有效,但有时我必须不断更改值直到它再次有效,我相信我必须在某处添加异步或等待?对不起,我刚开始学习颤振,我还在想办法:D
    • 非常感谢您的回答,因为他们对我帮助很大! :D 谢谢!
    【解决方案2】:
    databaseReferenceTest
    .child('MedicalCenter')
    .onValue.listen((event) {
      var snapshot = event.snapshot;
      setState(() {
        String value = snapshot.value['Relay1']['Data'];
      print('Value is $value');
      });
    });
    

    这应该可以... 我刚刚添加了 setState,

    【讨论】:

    • 你能告诉我们它为什么有效吗?以前缺少的 setState 做了什么?
    • setState 用于刷新布局,所以如果 Text 取值自 >String value = snapshot.value ['Relay1'] ['Data'];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多