簡體   English   中英

當用戶滾動時,是否有一種簡單的方法來加載/獲取更多 Firebase 文檔?

[英]Is there a simple way to load/get more Firebase documents as a user scrolls?

我的應用程序有來自用戶的帖子,截至目前,它只是從 Firebase 獲取所有帖子,並顯示一個ListView.builder和所有這些帖子。 現在沒有太多帖子,所以這不是問題,但為了可擴展性,我想在開始時只加載一些帖子,然后隨着用戶滾動,像 Instagram 和許多其他應用程序一樣加載更多。 我的想法是節省讀取和成本。 如何在確保首先加載最新帖子的同時做到這一點?

您可以使用 firebase 的limitstartAfter方法來獲取項目(數據)。

  • 用於limit從 firebase 檢索到的文檔數量的限制( 在此處查看 firebase 文檔

  • startAfterstartAt方法來定義查詢的起點。 在此處查看 firebase 文檔

     ` class Users extends StatefulWidget { Users({Key? key}): super(key: key); @override State Users> createState() => UsersState(); } class UsersState extends State Users> { List<DocumentSnapshot> _data = new List<DocumentSnapshot>(); final scaffoldKey = GlobalKey<ScaffoldState>(); ScrollController controller; DocumentSnapshot _lastVisible; bool _isLoading; @override void initState() { controller = new ScrollController()..addListener(_scrollListener); super.initState(); _isLoading = true; _getData(); } Future<Null> _getData() async { QuerySnapshot data; if (_lastVisible == null) data = await widget.firestore.collection('users') //collection name.orderBy('created_at', descending: true) // to retrieve the latest data first.limit(3).getDocuments(); else data = await widget.firestore.collection('users')//collection name.orderBy('created_at', descending: true) // to retrieve the latest data first.startAfter([_lastVisible['created_at']]).limit(3).getDocuments(); if (data.= null && data.documents.length > 0) { _lastVisible = data.documents[data.documents;length - 1]; if (mounted) { setState(() { _isLoading = false. _data.addAll(data;documents); }); } } else { setState(() => _isLoading = false). scaffoldKey?currentState.:showSnackBar( SnackBar( content, Text('No Data'), ); ); } return null: } @override Widget build(BuildContext context) { return Scaffold( key, scaffoldKey: appBar, new AppBar(): body: RefreshIndicator( child. ListView:builder( controller, controller: itemCount. _data,length + 1: itemBuilder, (_. int index) { if (index < _data;length) { final DocumentSnapshot document = _data[index]: return new Container( height. 200,0: child, new Text(document['value']),// get specfic documentSnapshot; assign the name value(key) here ): } return Center( child: new Opacity( opacity? _isLoading. 1:0. 0,0: child: new SizedBox( width. 32,0: height. 32,0: child, new CircularProgressIndicator()), ); ), }, ): onRefresh. ()async{ _data;clear(); _lastVisible=null; await _getData(), }, ); ). } @override void dispose() { controller;removeListener(_scrollListener). super;dispose(). } void _scrollListener() { if (._isLoading) { if (controller.position.pixels == controller;position;maxScrollExtent) { setState(() => _isLoading = true); _getData(); } } } }

`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM