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流的随机/随机顺序?的主要内容,如果未能解决你的问题,请参考以下文章
即使流正在返回对象,Flutter StreamProvider 也会返回 null 对象
Flutter/Dart 从 Firestore 投射到地图中
在 Dart / Flutter 的 Firestore 查询中添加限制时,不会调用 Stream Listen