【发布时间】:2022-02-16 23:45:13
【问题描述】:
我有来自Firebase 的对象的ListView,我希望在数据更改时使用StreamBuilder 刷新它。
我可以很好地加载我的列表,并且当数据更改时我的列表会刷新。
我遇到的问题不是刚刚更新更改的ListTile,而是我看到该图块被复制,因此我看到了新更改和旧更改。
这是我的设置:
final ref = FirebaseDatabase.instance.reference();
late DatabaseReference itemRef;
late FirebaseDatabase database = FirebaseDatabase();
late StreamSubscription _objectInfoStreamSub; // Not sure if needed?
late List<CustomObject> data = [];
@override
void initState() {
super.initState();
final keys = Global.kData.keys;
for (final key in keys) {
// Initialize this...
itemRef = database.reference().child('ABC').child(key.toString());
}
// Load the data...
_setListeners();
}
// Here is where I load my data initially...
Future<void> _setListeners() async {
// Clear out our data before we reload...
data.clear();
final keys = Global.kData.keys;
for (final key in keys) {
_objectInfoStreamSub =
ref.child("ABC").child(key.toString()).onValue.listen(
(event) {
setState(() {
// Mapped the data...
final firebaseData = Map<String, dynamic>.from(event.snapshot.value);
// Create the Room...
final room = CustomObject.fromJson(firebaseData);
// Check if blocked...
// Logic to see if user is blocked
// check if isArchived
// Logic to see if room is archvied
if (!isBlocked && !isArchived) {
if (!data.contains(room)) {
data.add(room);
}
}
// Sort by date
// Logic to sort so the most recent is at top
});
},
);
}
}
// Here is my updated StreamBuilder...
SliverToBoxAdapter(
child: StreamBuilder<dynamic>(
stream: itemRef.child('ABC').onValue,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(),
);
}
if (snapshot.hasData &&
snapshot.connectionState == ConnectionState.active) {
return ListView.builder(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: data.length,
itemBuilder: (BuildContext context, int index) {
return ChatRoom(
data: data[index],
);
},
);
} else {
return Container();
}
},
),
),
【问题讨论】:
-
如果您使用
List data显示在 CustomListTile 上,那么您不应该依赖 StreamBuilder 的快照吗?目前尚不清楚List data是如何从您提供的代码 sn-p 更新的。 -
您确定,您在 Firebase 上没有重复数据,对吧?
-
正确。我有一个刷新按钮,如果我点击它,它会将我的 ListView 重置为正常。在被调用的方法中,我正在清除数据并再次获取它。所以,我的流构建器中的某些东西并没有做同样的事情。它只是看到有新的东西并添加它而不是找到正确的行并更新该行。
-
我已经更新了上面的代码。
标签: flutter listview firebase-realtime-database stream-builder