用户登录

新建一个评论列表需要用的 Store,放在 lib/comment/index 里面,名字是 comment_index_store.dart ,在文件里定义一个 Store,包含的文件是 comment_index_store.g.dart 。 名字是 CommentIndexStore。

在这个构造方法里添加两个带名字的参数,required this.appService,再添加一个 required this.scrollController 。请求评论列表数据的时候需要用这个 appService ,处理列表滚动加载的时候需要一个 scrollController 。

属性

下面定义两个属性,类型是 AppService,名字是 appService,再添加一个 ScrollController ,名字是 scrollController。 下面再定义一个方法,返回的是 List 名字是 parseComments,接收一个 responseBody 参数,方法里声明一个 List 名字是 parsed,值可以用一下 jsonDecode 处理一下 responseBody。

接着调用 map,类型是 Comment,提供一个回调,当前项目是 item,返回的是 Comment.fromJson 把 item 交给这个方法。 再调用 toList 转换成一个列表。最后 return 这个 parsed 。

再定义两个 getter ,返回的值是 bool ,名字是 scrollOffset,值是 scrollController 里的 offset ,滚动的距离。下面这个返回的值的类型是 ScrollPosition,名字是 scrollPosition,值是 scrollController 里的 position 属性。

再定义一个 getter,返回的值的类型是 bool 名字是 touchDown ,表示滚动评论列表触底了,这时候可以加载新的列表数据。返回的结果需要判断一些条件,scrollPosition.userScrollDirection 等于 ScrollDirection.reverse ,并且 !scrollPosition.outOfRange ,同时还要 scrollOffset 大于等于 scrollPosition.maxScrollExtent 减掉 500 。

数据

下面再去定义一些需要用的数据。类型是 ObservableList? 名字是 comments ,表示评论列表数据。再添加一个 bool 类型的 loading,默认值是 false。 然后添加一个 int 类型的 nextPage,表示要加载的下一页的页码,默认值是 1 。再添加一个 int? ,名字是 totalCount 。

然后添加一个 Map? 名字是 filter,表示请求评论列表数据的时候需要用的过滤器,比如想要过滤出某个内容的评论,这个 filter 里面可以添加一个 'post' ,对应的值是内容的 id 。

计算属性

再去定义一些计算属性,返回的是 int,名字是 totalPages 总共的页数,值是 totalCount 看看等不等于 null ,如果是的话就是 0,不然的话可以计算一下,totalCount! 评论列表项目总数,除以每页的评论列表项目数量,再调用一下 ceil() 。

再定义一个计算属性,返回的是 bool,名字是 hasMore,表示是否还有要加载的列表数据,返回的值判断一下 totalPages 减 nextPage 是否大于等于 0 。这里提示 totalPages 未定义,因为这里这个名字之前我写错了,修改一下。

下面可以再定义一个表示是否有评论列表数据用的计算属性,类型的 bool ,名字是 hasComments ,返回的值判断一下 comment != null 并且 comments!.length 大于 0 。

动作

再去定义修改数据用的一些动作,先添加一个 setComments ,接收的参数类型是 List ,判断一下 nextPage 是不是等于 1 ,如果是就让 comments 等于 ObservableList.of ,把 data 交给这个方法。

else,不然就让 comments 等于一个 ObservableList.of,提供一个列表,先把 comments 原有的东西放进来,再把 data 里的东西放到这个列表里。

下面定义一个 setLoading ,接收的参数类型是 bool ,让 loading 等于 data。

再定义一个 setNextPage,参数是可选的,放在一组方括号里,类型是 int? 名字是 data。判断 data != null ,如果是就让 nextPage 等于 data。else 不然的话就让 nextPage 的值等于它原来的值加上 1 。

下面再定义一个 setTotalCount,接收一个 String 类型的 data 参数。动作里判断一下 data != null ,如果是,就让 totalCount 等于,用 int.parse 处理一下 data。

然后再定义一个 reset ,在这个动作里面,把 comments 修改成 null,再把 nextPage 修改成 1 。

再定义一个 setFilter,参数类型是 Map,让 filter 等于 data。

下面再定义一个请求评论列表数据用的方法,返回的是 Future> 名字是 getComments,用 async 标记一下。

方法里用一组 try,catch ,catch 到错误可以 throw 一个 HttpException ,再添加一个 finally ,这里可以执行 setLoading,参数值是 false。

在 try 这里,执行 setLoading,提供的参数值是 true, 然后声明一个 queryParameters ,等于 filter ,如果是 null 就等于一个空白的 Map 。

下面再声明一个 queryString ,新建一个 Uri,设置一下 queryParameters ,值是 queryParameters ,然后访问一下这个 Uri 的 query 属性。

再声明一个 uri,值可以用 Uri.parse 处理一下评论列表接口地址,先是 AppConfig.apiBaseUrl,斜线 comments ,加上一个 page 查询符,值是 nextPage,& 再加上 queryString 表示的查询符。

声明一个 response,表示请求得到的响应,await,执行 appService.apiHttpClient.get,把 uri 交给这个方法。下面声明一个 parsed,用一下 parseComments ,把 response.body 交给这个方法。

提示 parseComments 有问题,之前定义这个方法的时候,名字里少了一个 s 。

再继续编辑这个 getComments, 下面可以执行一下 setComments ,提供一个 parsed,再执行 setTotalCount ,提供一个 response.headers ,用一下 x-total-count 这个头部数据的值。

然后执行 setNextPage() ,最后 return 这个 parsed 。

这里提示 queryString 没有用到,这是因为在这个地址里面,在字符串里使用变量的值需要加上 $ 符号。

定义评论列表 Store(CommentIndexStore)《 Flutter 移动端实例:评论列表 》

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点