Flutter页面跳转后参数没更新,页面显示旧数据怎么办?
大家好,我在做商品列表跳转详情页时遇到个问题:点击不同商品都显示第一个商品的详情。已经用Navigator.pushNamed传了参数,也尝试过热重载,但新页面就是不刷新数据。
代码大概是这样的:
ListView.builder(
itemBuilder: (context, index) {
return ListTile(
title: Text(products[index].name),
onTap: () {
Navigator.pushNamed(
context,
'/detail',
arguments: products[index].id
);
},
);
},
),
而在详情页用的是:
final productId = ModalRoute.of(context)!.settings.arguments as String;
final product = products.firstWhere((p) => p.id == productId);
第一次跳转正常,但第二次点击其他商品时,productId能正确变化,product却还是第一次查询的结果。是不是需要手动重置数据?或者哪里没重建widget?
firstWhere没处理好导致的。直接用的话要注意,当找不到对应id的时候可能会出错。不过你的问题应该是页面没刷新吧?那问题出在页面跳转时详情页的widget没有重新构建。你在详情页的
build函数里用的ModalRoute.of(context)是没问题的,但product变量是在widget外面查的,只会执行一次。想改的话可以把逻辑放到
initState里,或者直接在build里面查。比如这样:或者你可以用
StatefulWidget,然后在initState里获取参数,再查数据赋值给state变量。不过记住不要在initState里直接赋值给product然后在build里用,那也是一样的问题。总之原因就是product查了一次就再也不变了。要么在build里查,要么用
StatefulWidget配合setState手动更新。