我正在使用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(),);
}
}
1条答案
按热度按时间zphenhs41#
当你用
onValue
监听Firebase中的数据时,你得到的event
包含了所有数据的快照。即使只添加/更改/删除了一个子节点,快照也会包含所有数据。所以当你把快照中的数据添加到list
时,你最初是一次性添加了所有子节点--但是在更新时,你又添加了大部分子节点。解决这个问题最简单的方法是每次
onValue
通过调用list.clear()
触发事件时清空列表。