现在有个问题,就是不管我们先打开的是哪个内容项目,显示的都是第一个内容项目。下面我们可以使用 PageController 解决这个问题。
post_index_store
先打开 post_index_store,在这个 store 里定义一个方法可以得到某个内容项目在内容列表里的对应的索引号,方法返回的值的类型是 int,名字是 getPostIndex ,接收一个 int 类型的参数,名字是 postId。
return 的值可以判断一下 posts 是不是等于 null ,如果是就返回 - 1,不是的话,可以用一下 posts!.indexWhere,提供一个函数参数,当前项目是 post,返回的是 post.id 等于 postId 这个参数值的项目。这个 indexWhere 可以返回第一个符合条件的项目在列表里对应的索引号。
post_show
再打开 post_show,先声明一个属性,用 late 标记一下,类型是 PageController 名字是 pageController。
在 initState 这里,声明一个 index,它表示当前内容项目在列表里的索引号,用一下 postIndexStore.getPostIndex,参数值可以用 int.parse 处理一下 widget.postId。
下面设置一下 pageController 的值,新建一个 PageController,设置一下 initialPage 的值,让它等于 index,也就是当前内容项目在列表里的索引号。
再添加一个 dispose 方法,在这个方法里,执行 pageController.dispose() 扔掉用不到的这个 PageController 。
找到 PageView 的 builder ,在它里面添加一个 controller,值是 pageController。创建这个 PageController 的时候设置了正确的页面索引号。
测试
再测试一下,打开一个内容项目,你会发现,这次就会显示正常的内容项目了。