如何判断HomePage是否存在于Widget类型的页面列表中?
解决Widget列表判断是否包含指定页面类型的问题
你用pages.contains(Home())返回false的核心原因是:每次调用Home()都会创建一个全新的Home实例,而List的contains方法默认通过==运算符比较对象。对于未重写==的类来说,==比较的是对象的内存引用——列表里的Home实例和你传入的新Home实例不是同一个对象,所以判断结果为false。
下面是几种可行的解决方式:
通过类型判断(最适合导航场景)
遍历列表,检查元素的类型是否为Home,无需关心实例是否相同:bool hasHomePage = pages.any((page) => page is Home);如果需要找到列表中的Home实例,可以用:
Home? homePage = pages.firstWhere((page) => page is Home, orElse: () => null);重写
==和hashCode(基于实例属性判断相等)
如果你的Home类有唯一标识属性(比如页面ID),可以重写这两个方法让contains能基于属性判断相等:class Home extends StatelessWidget { final String pageId; const Home({required this.pageId, super.key}); @override bool operator ==(Object other) => identical(this, other) || other is Home && runtimeType == other.runtimeType && pageId == other.pageId; @override int get hashCode => pageId.hashCode; @override Widget build(BuildContext context) { // 页面构建逻辑 return const Scaffold(); } }之后创建列表和判断时使用相同pageId的实例即可:
List<Widget> pages = [const Home(pageId: 'home'), SecondPage(), ThirdPage(), SizedBox()]; bool hasHome = pages.contains(const Home(pageId: 'home')); // 返回true复用同一个实例
提前创建好Home实例,列表和判断都使用这个实例:final homePage = Home(); List<Widget> pages = [homePage, SecondPage(), ThirdPage(), SizedBox()]; bool hasHome = pages.contains(homePage); // 返回true
对于导航场景,推荐第一种类型判断的方式,因为通常只需要确认列表中是否存在该类型的页面,不需要关注具体实例。
内容的提问来源于stack exchange,提问作者Senthur Kumaran
相关产品推荐
相关产品推荐

