.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;
    }
  }
}

顺便说一句,变量名首字母不要大写