.contains 不像我想象的那样工作 Flutter/Dart

3 dart flutter pls

我对 Flutter 很陌生,遇到了一个问题。我想检查List: items是否包含单词 Hey,我知道它包含在内。所以我写道: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(),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

jul*_*101 9

如果您阅读文档,您将看到以下内容:

如果集合包含等于 的元素,则返回 true element

...

用于确定是否element等于可迭代元素的相等性默认为该Object.==元素的 。

https://api.dart.dev/stable/2.8.4/dart-core/Iterable/contains.html

因此,当您尝试执行if (items.contains('Hey'))它时,它会返回 false,因为列表中没有对象等于'Hey'。实际上,'Hey'是一个字符串,您的列表包含Liste对象。

完成您想要做的事情的更好方法是.any像这样使用,它将迭代您的列表并对每个元素运行检查以检查是否有任何元素返回 true:

    if (items.any((e) => e.Wort1 == 'Hey' || e.Wort2 == 'Hey')) {
      return Center(
        child: Text('Works'),
      );
    }
Run Code Online (Sandbox Code Playgroud)

或者,如果与这样的比较,您可以实现==运算符Liste来实际返回:trueString

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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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