新建一个评论列表需要用的 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
接着调用 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
然后添加一个 Map
计算属性
再去定义一些计算属性,返回的是 int,名字是 totalPages 总共的页数,值是 totalCount 看看等不等于 null ,如果是的话就是 0,不然的话可以计算一下,totalCount! 评论列表项目总数,除以每页的评论列表项目数量,再调用一下 ceil() 。
再定义一个计算属性,返回的是 bool,名字是 hasMore,表示是否还有要加载的列表数据,返回的值判断一下 totalPages 减 nextPage 是否大于等于 0 。这里提示 totalPages 未定义,因为这里这个名字之前我写错了,修改一下。
下面可以再定义一个表示是否有评论列表数据用的计算属性,类型的 bool ,名字是 hasComments ,返回的值判断一下 comment != null 并且 comments!.length 大于 0 。
动作
再去定义修改数据用的一些动作,先添加一个 setComments ,接收的参数类型是 List
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
下面再定义一个请求评论列表数据用的方法,返回的是 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 没有用到,这是因为在这个地址里面,在字符串里使用变量的值需要加上 $ 符号。