【问题标题】:flutter and firestore re sort listview on data updateFlutter 和 Firestore 在数据更新时重新排序列表视图
【发布时间】:2021-05-02 23:28:36
【问题描述】:

当 Firestore 项目更改时,我无法刷新列表视图。当添加新项目并显示在列表中并更新视图时,它可以完美运行。我们正在使用 orderby 子句及其经常更改的字段进行查询。我们注意到列表内部发生了变化,因为顺序发生了变化,但是因为列表视图没有刷新和重新排序。当用户点击一个项目时,他们最终会选择一个错误的项目。

小部件代码如下所示:

Widget buildFuture(bool isIndian, bool isJapan){

return FutureBuilder<Stream<List<Map<String,dynamic>>>>(

future: Provider.of<CountryProvider>(context)

.getList(currentUserId, isIndian, isJapan),

builder: (ctx, snap) {

if (!snap.hasData) {

return Center(

child: CircularProgressIndicator(),

);

}

return StreamBuilder<List<Map<String,dynamic>>>(

stream: snap.data,

builder:

(ctx, AsyncSnapshot<List<Map<String,dynamic>>> snapshot) {

if (!snapshot.hasData) {

return Center(

child: CircularProgressIndicator(),

);

}



usersData = snapshot.data;



if (snapshot.data.isEmpty) {

return Center(

child: Column(

mainAxisSize: MainAxisSize.min,

children: [

Image.asset('assets/images/icon.png'),

Text(

'Aha Nothing found',

textAlign: TextAlign.center,

style: Theme.of(context)

.textTheme

.bodyText1

.copyWith(fontSize: 18),

),

],

),

);

}



return _getListView(snapshot);

},

);

},

);

}

_getListView(snapshot) {





return ListView.builder(

itemCount: snapshot.data.length,

itemBuilder: (ctx, index) {

return UserItem(

userDocument: snapshot.data[index],

);

},

);



}

这是我们从 Firestore 获取的方式:

Stream<QuerySnapshot> snapshots= _firestore.collection(Constants.COUNTRY_COLLECTION).where('isIndian' , isEqualTo: isIndian).where('isJapan' , isEqualTo: isJapan).orderBy("lastOnline",descending: true).snapshots();
return snapshots.transform(
StreamTransformer<QuerySnapshot, List<Map<String,dynamic>>>.fromHandlers(
handleData: (querySnapshot, sink) async {

}

firestore 数据库中有复合索引。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore flutter-layout


    【解决方案1】:

    如果它可以帮助任何人。我通过将我的列表视图移动到 reorderablelistview 来解决它:

    _getListView(usersData) {
    
    
            return ReorderableListView(children:  List.generate(usersData.length, (int index) {
                return UserItem(
                  userDocument: usersData[index],key:UniqueKey()
                );
              },
            ),
            onReorder:_doRefreshed );
    
      }
     _doRefreshed(int oldIndex, int newIndex){
        print("Refresh is called");
       setState(
             () {
           if (newIndex > oldIndex) {
             newIndex -= 1;
           }
    
           usersData.insert(newIndex, usersData.removeAt(oldIndex));
         },
       );
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2021-02-07
      • 2016-08-26
      • 1970-01-01
      相关资源
      最近更新 更多