.contains不能像我想的那样颤动/飞镖

时间:2020-07-27 17:17:03

标签: flutter dart pls

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

1 个答案:

答案 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;
    }
  }
}

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