Flutter / Dart中Firestore流的随机/随机顺序?

Posted

技术标签:

【中文标题】Flutter / Dart中Firestore流的随机/随机顺序?【英文标题】:Randomize/shuffle order of Firestore stream in Flutter/Dart? 【发布时间】:2020-03-20 14:33:06 【问题描述】:

我正在创建一个使用流构建器的应用,从 Firestore 云中提取数据。代码如下:

return Scaffold(
  backgroundColor: Colors.black,
  appBar: appBar,
  drawer: Sidebar(),
  body: Center(
    child: StreamBuilder(
      stream: stream,
      builder: (context, snapshot) 
        if (!snapshot.hasData) 
          return Text(
            "Loading...",
            style: TextStyle(
              color: Colors.white,
            ),
          );
         else 
          return GridView.builder(
            itemCount: snapshot.data.documents.length,
            shrinkWrap: true,
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: globals.gridCountValue != null ? globals.gridCountValue : 2,
            ),
            itemBuilder: (context, index) 
              return _buildList(context, snapshot.data.documents[index]);
            ,
          );
        
      ,
    ),
  ),
  floatingActionButton: FloatingActionButton(
    // onPressed: () => shuffleAlbums(),
    onPressed: () ,
    child: Icon(Icons.shuffle),
    elevation: 2,
    backgroundColor: Colors.black,
  ),
  floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
);

_buildList:

  Widget _buildList(BuildContext context, DocumentSnapshot document) 
    if (document.data != null) 
      return new AlbumTile(data: document.data);
    
  

当我使用硬编码的专辑列表时,我能够打乱列表的顺序,但现在我使用的是流构建器,我不知道如何达到这个结果。我基本上想按一个按钮以随机顺序重新排序列表。

感谢您的阅读!

【问题讨论】:

【参考方案1】:

有多种方法可以为来自流的列表实现洗牌功能。

其中一个将使用bloc 模式(基本上将 UI 与业务逻辑分开),您可以在其中添加另一个流(我们称之为list stream)来监听 Firestore 流(因为据我所知,Firestore 流中的数据是不可变的),当用户按下按钮时,您只需从list stream 获取数据,将其随机播放,然后将其推回list stream。 这样,您仍然可以使用StreamBuilder 来显示数据。 如果您想了解更多关于 bloc 模式的信息,可以在此处阅读更多信息:https://www.raywenderlich.com/4074597-getting-started-with-the-bloc-pattern(不是我的网站)

或者您可以在Widget 中拥有一个变量(本质上是一个数组),它可以监听来自 Firestore 流的更改并根据该变量更新 UI。按下按钮后,重新洗牌变量并重置状态。

【讨论】:

以上是关于Flutter / Dart中Firestore流的随机/随机顺序?的主要内容,如果未能解决你的问题,请参考以下文章

在 Dart 中保存流的最后发出的值

即使流正在返回对象,Flutter StreamProvider 也会返回 null 对象

Flutter/Dart 从 Firestore 投射到地图中

在 Dart / Flutter 的 Firestore 查询中添加限制时,不会调用 Stream Listen

查询时如何在 Flutter (Dart) 中使用变量 Cloud Firestore

在 dart/flutter 中执行多次从 firestore 获取数据的异步函数