如何解决列表视图中的索引不正确

时间:2020-03-08 13:44:14

标签: flutter

我正在Flutter中使用列表视图+分页来显示我的响应数据。

当我选择第一个列表项时,我会遇到问题,例如id之类的详细信息是另一个列表项id。我使用print()来检查ID,它总是显示错误的ID。

我想显示有关图像的详细信息,但这给我错误的ID。这样它将显示其他图像。

我该如何解决问题?

1 个答案:

答案 0 :(得分:1)

不需要将idtitle定义为State对象的变量。 您可以将它们作为参数传递给selectedItem方法,问题是您总是将idtitle设置为最后构建的项,因此它将始终以其详细信息导航,而不是实际选择的项目。

class _HomePage State extends State<HomePage > {
GlobalKey<PaginatorState> paginatorGlobalKey = GlobalKey();

@override
Widget build(BuildContext context) {
body: return Paginator.listView(
key: paginatorGlobalKey,
pageLoadFuture: sendPagesDataRequest,
pageItemsGetter: listItemsGetterPages,
listItemBuilder: listItemBuilder,
loadingWidgetBuilder: loadingWidgetMaker,
errorWidgetBuilder: errorWidgetMaker,
emptyListWidgetBuilder: emptyListWidgetMaker,
totalItemsGetter: totalPagesGetter,
pageErrorChecker: pageErrorChecker,
scrollPhysics: BouncingScrollPhysics(),
);
}

Future<PagesData> sendPagesDataRequest(int page) async {
String url = Uri.encodeFull("https://API_URL?page=$page");
http.Response response = await http.get(url);
PagesData pagesData = pagesDataFromJson(response.body);
return pagesData;

List<dynamic> listItemsGetterPages(PagesData pagesData) {
List<Project> list = [];
pagesData.data.forEach((value) {
 list.add(value);
 });
 return list;
}

Widget listItemBuilder(dynamic item, int index) {

 return InkWell(
  onTap: () => selectedItem(item,context), // pass the item iteself in the selectedItem function
  child:  new CachedNetworkImage(
   imageUrl:= item.image,
   placeholder: (context, url) => new CircularProgressIndicator(),
   errorWidget: (context, url, error) => new Icon(Icons.error),
   fit:BoxFit.fill,
   ),
);
}

Widget loadingWidgetMaker() {
 return Container(
 alignment: Alignment.center,
 height: 160.0,
 child: CircularProgressIndicator(),
 );
 }

void selectedItem(dynamic item,BuildContext context) { // add a parameter for item
 Navigator.of(context).pushNamed(
  DetailsPage.routeName,
  arguments: {
   'id': item.id, // Move the item.id here
   'title': item.title // Move the item.title here
   });    
  }
}