Flutter页面跳转后参数没更新,页面显示旧数据怎么办?

南宫子冉 阅读 89

大家好,我在做商品列表跳转详情页时遇到个问题:点击不同商品都显示第一个商品的详情。已经用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?

我来解答 赞 7 收藏
二维码
手机扫码查看
1 条解答
长孙艳杰
你这问题应该是firstWhere没处理好导致的。直接用的话要注意,当找不到对应id的时候可能会出错。不过你的问题应该是页面没刷新吧?

那问题出在页面跳转时详情页的widget没有重新构建。你在详情页的build函数里用的ModalRoute.of(context)是没问题的,但product变量是在widget外面查的,只会执行一次。

想改的话可以把逻辑放到initState里,或者直接在build里面查。比如这样:

class DetailPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final productId = ModalRoute.of(context)!.settings.arguments as String;
final product = products.firstWhere((p) => p.id == productId);

return Scaffold(
appBar: AppBar(title: Text(product.name)),
body: Text(product.description),
);
}
}


或者你可以用StatefulWidget,然后在initState里获取参数,再查数据赋值给state变量。不过记住不要在initState里直接赋值给product然后在build里用,那也是一样的问题。

总之原因就是product查了一次就再也不变了。要么在build里查,要么用StatefulWidget配合setState手动更新。
点赞 5
2026-02-06 06:01