yag*_*ete 2 sorting list observable flutter
我无法按给定属性对可观察的 RxList 进行排序。当我使用 BloC 方法(使用简单的列表)时,排序工作得很好。
\n最近,我将状态管理更改为 GetX ( https://github.com/jonataslaw/getx ) 包,因为我看到了几个优点(不需要上下文、转换到页面等)。
\n这里有两种情况,我的不好,前面没有解释,让我把小黄瓜放进去
\n场景一:
\nGiven user in Posts Screen\nWhen user Pull down to get Newest posts\nThen user get the newly fetched posts on top of the previous loaded list\n
Run Code Online (Sandbox Code Playgroud)\n场景2:
\nGiven user in Posts Screen\nWhen user reaches the end of the list\nThen user get more posts at the end of the previous loaded list\n
Run Code Online (Sandbox Code Playgroud)\npost_model.dart
\nclass Post {\n final int id;\n final String title;\n final DateTime date;\n final User user;\n\nPost({\n @required this.id,\n @required this.title,\n @required this.date,\n this.user});\n \n}\n
Run Code Online (Sandbox Code Playgroud)\npost_controller.dart
\nimport \'dart:async\';\n\nimport \'package:get/state_manager.dart\';\nimport \'package:blog/models/post.dart\';\nimport \'package:blog/services/posts_api.dart\';\n\nclass PostsController extends GetxController {\n int _page = 0;\n\n ---------HERE OBS LIST-----------\n RxList posts = [].obs;\n\n @override\n void onReady() {\n super.onReady();\n this.loadPosts();\n }\n\n Future<void> loadPosts({isRefreshLoad = false}) async {\n int pager;\n if (isRefreshLoad) {\n pager = 1;\n } else {\n increment();\n pager = this._page;\n }\n\n Map<String, String> arguments = {\'page\': \'$pager\'};\n final List<Post> newPosts =\n await PostsApi.instance.getPosts(arguments: arguments);\n\n // remove duplicates\n posts.addAll(\n newPosts.where(\n (newPosts) => posts.every((post) => newPosts.id != post.id),\n ),\n );\n\n //----------HERE\'S THE EXCEPTION----------\n posts.sort((a, b) => b.id.compareTo(a.id));\n update([\'posts\']);\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n错误
\nflutter: [GETX] PostsController has been initialized\n[VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: type \'Post\' is not a subtype of type \'List<dynamic>\'\n#0 RxList.remove \npackage:get/\xe2\x80\xa6/rx/rx_impl.dart:333\n
Run Code Online (Sandbox Code Playgroud)\nPostsScreen.dart
\nScaffold(\n backgroundColor: Color.fromRGBO(58, 66, 86, 1.0),\n appBar: AppBarWidget(\n drawerOpen: drawerPosition,\n appBarVisible: _isVisible,\n drawerVisible: true,\n ),\n body: ColorfulSafeArea(\n overflowRules: OverflowRules.only(left: true, bottom: true),\n child: GetBuilder<PostsController>(\n id: \'posts\',\n init: PostsController(),\n builder: (_postsController) {\n _postsControllerGlobal = _postsController;\n // Scenario 1 - Triggers when user pull down to get new posts\n return RefreshIndicator( \n onRefresh: () {\n return _postsController.loadPosts(\n isRefreshLoad: true);\n },\n child: StreamBuilderWidget(\n stream: _postsController.posts.stream,\n // Scenario 2 Triggers when scroll controller reaches end of list\n scrollController: _scrollController, isDrawerOpen: _isDrawerOpen,\n widgetType: \'PostItemWidget\',\n ),\n );\n },\n ),\n ),\n ),\n
Run Code Online (Sandbox Code Playgroud)\n---- enter code here
------
我需要一种方法,在将获取的帖子列表添加到流中后,始终按日期递减顺序重新排序,无论触发器已被 PullDown 还是到达列表的最后末尾,以便始终按发布顺序显示项目。
\n希望有人能帮我一把。
\n经过几天的尝试,我发现它要简单得多,而且由于我缺乏知识。
由于列表是可观察的,只需将其转换为列表就足以完成排序:
正常列表
可观察列表
谢谢!