firebase Flutter:侦听更改时实时数据库追加列表

f1tvaqid  于 2022-11-17  发布在  Flutter
关注(0)|答案(1)|浏览(151)

我正在使用flutter和firebase实时数据库。我正在尝试从一个特定的节点读取数据。我正在保存我在Orderlist类中收集的数据,然后我返回一个Orderlist的Future列表。这个Future函数我正在尝试在另一个小部件上使用。我希望每次数据更新时都在屏幕上显示。

Future<List<Orderlist>> order() async{
  String business =await businessname();
  List table = await tables();
  
  List<Orderlist> list = [];
  table.forEach((element) async{
   
    String payment_method = '';
    String payment_state ='';
    var snapshot =  ref.child(business).child(element.toString()).onValue.listen((event) {
      event.snapshot.children.forEach((method) {
      
      if(method.key=='payment_method') payment_method=method.value.toString();
      if(method.key=='payment_state') payment_state = method.value.toString();
      
      
    });
    final order = Orderlist(payment_method: payment_method,payment_state: payment_state);
    
    list.add(order);
    });
    
  });
  
  return list;
}

问题是,在第一个地方的数据是加载在屏幕上,但当我试图更新数据的一些原因,该列表是追加,而我只是想取代以前的数据与更新的数据。更具体地说,如果我想听取2个节点更新,我将有一个列表与2个Orderlist项目。但问题是,当我更新其中之一,该列表扩展为3 Orderlist项目。这是我尝试使用Future函数的小部件first data loadedUpdated da

class TempSettings extends StatefulWidget {
  const TempSettings({super.key});

  @override
  State<TempSettings> createState() => _TempSettingsState();
}

class _TempSettingsState extends State<TempSettings> {
  String? business;
  List<Orderlist> list=[];
    final user = FirebaseAuth.instance.currentUser;
    @override
  void initState() {
    // TODO: implement initState
     
      g();
    
    
    super.initState();
  }
    void g() async{
      
      list = await DatabaseManager(user_uid: user!.uid).order();[![[![enter image description here](https://i.stack.imgur.com/hn2NQ.png)](https://i.stack.imgur.com/hn2NQ.png)](https://i.stack.imgur.com/SJ4M1.png)](https://i.stack.imgur.com/SJ4M1.png)
      
    }
  @override
  Widget build(BuildContext context) {
    return Column(children: list.map((e) => ListTile(title: Text(e.payment_method!),)).toList(),);
  }
}
zphenhs4

zphenhs41#

当你用onValue监听Firebase中的数据时,你得到的event包含了所有数据的快照。即使只添加/更改/删除了一个子节点,快照也会包含所有数据。所以当你把快照中的数据添加到list时,你最初是一次性添加了所有子节点--但是在更新时,你又添加了大部分子节点。
解决这个问题最简单的方法是每次onValue通过调用list.clear()触发事件时清空列表。

相关问题