.contains 不像我想象的那样工作 Flutter/Dart
.contains doesnt work like i thought it would Flutter/Dart
我是 Flutter 的新手,我 运行 遇到了一个问题。我想检查 List: items 是否包含单词
嘿 我知道它确实如此。所以我写道:if(items.contains('Hey'))
来检查。但它似乎跳过了 if
部分,只跳过了 returns 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(),
);
}
}
如果您阅读文档,您将看到以下内容:
Returns true if the collection contains an element equal to element
.
...
The equality used to determine whether element
is equal to an element of the iterable defaults to the Object.==
of the element.
https://api.dart.dev/stable/2.8.4/dart-core/Iterable/contains.html
因此,当您尝试 if (items.contains('Hey'))
时,它 return 是错误的,因为您的列表中没有对象等于 'Hey'
。实际上,'Hey'
是一个字符串,您的列表包含 Liste
个对象。
一个更好的方法来做你想做的事情是像这样使用 .any
这将遍历你的列表和 运行 检查每个元素以检查是否有任何元素 return是真的:
if (items.any((e) => e.Wort1 == 'Hey' || e.Wort2 == 'Hey')) {
return Center(
child: Text('Works'),
);
}
或者,如果与 String
进行比较,您可以在 Liste
上实现 ==
运算符以实际 return true
:
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;
}
}
}
顺便说一句,变量名首字母不要大写
我是 Flutter 的新手,我 运行 遇到了一个问题。我想检查 List: items 是否包含单词
嘿 我知道它确实如此。所以我写道:if(items.contains('Hey'))
来检查。但它似乎跳过了 if
部分,只跳过了 returns 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(),
);
}
}
如果您阅读文档,您将看到以下内容:
Returns true if the collection contains an element equal to
element
....
The equality used to determine whether
element
is equal to an element of the iterable defaults to theObject.==
of the element.
https://api.dart.dev/stable/2.8.4/dart-core/Iterable/contains.html
因此,当您尝试 if (items.contains('Hey'))
时,它 return 是错误的,因为您的列表中没有对象等于 'Hey'
。实际上,'Hey'
是一个字符串,您的列表包含 Liste
个对象。
一个更好的方法来做你想做的事情是像这样使用 .any
这将遍历你的列表和 运行 检查每个元素以检查是否有任何元素 return是真的:
if (items.any((e) => e.Wort1 == 'Hey' || e.Wort2 == 'Hey')) {
return Center(
child: Text('Works'),
);
}
或者,如果与 String
进行比较,您可以在 Liste
上实现 ==
运算符以实际 return true
:
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;
}
}
}
顺便说一句,变量名首字母不要大写