1

我对 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(),
    );
  }
}
4

1 回答 1

5

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

如果集合包含等于 的元素,则返回 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'),
      );
    }

或者,如果与这样的比较,您可以实现==运算符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;
    }
  }
}

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

于 2020-07-27T17:55:52.550 回答