我对Flutter很陌生,遇到了问题。我想检查列表:项目中是否包含单词
嘿,我知道。所以我写了:if(items.contains('Hey'))
来检查。但是它似乎跳过了if
部分,只返回了else部分。我写了这个简单的代码来向您展示我的意思。我真的很感激
快速答案,因为我确实需要解决此问题。
import 'package:flutter/material.dart';
void main() => runApp(MaterialApp(home: Contain()));
class Liste {
String Wort1;
String Wort2;
Liste({this.Wort1, this.Wort2});
}
class Contain extends StatefulWidget {
@override
_ContainState createState() => _ContainState();
}
class _ContainState extends State<Contain> {
List<Liste> items = List<Liste>();
@override
void initState() {
items = [
Liste(Wort1: 'Hey', Wort2: 'Ho'),
Liste(Wort1: 'HA', Wort2: 'HE'),
];
super.initState();
}
function() {
if (items.contains('Hey')) {
return Center(
child: Text('Works'),
);
} else {
return Center(
child: Text('Not Working'),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Title'),
),
body: function(),
);
}
}
答案 0 :(得分:1)
如果您阅读文档,将会看到以下内容:
如果集合包含等于
element
的元素,则返回true。...
用于确定
element
是否等于可迭代元素的相等性默认为该元素的Object.==
。
https://api.dart.dev/stable/2.8.4/dart-core/Iterable/contains.html
因此,当您尝试对if (items.contains('Hey'))
执行操作时,由于列表中没有任何对象等于'Hey'
,因此它返回false。实际上,'Hey'
是一个字符串,并且您的列表包含Liste
个对象。
一种更好的方法是使用.any
这样的方法,它会遍历您的列表并检查每个元素以检查是否有任何元素返回true:
if (items.any((e) => e.Wort1 == 'Hey' || e.Wort2 == 'Hey')) {
return Center(
child: Text('Works'),
);
}
或者,您可以在==
上实现Liste
运算符,以将其与true
进行比较,从而实际上返回String
:
class Liste {
String Wort1;
String Wort2;
Liste({this.Wort1, this.Wort2});
bool operator ==(other) {
if (other is String) {
return other == Wort1 || other == Wort2;
} else {
return false;
}
}
}
顺便说一句,请不要以首字母大写来命名变量。