【问题标题】:Flutter: generic list handles different key, value pairsFlutter:通用列表处理不同的键、值对
【发布时间】:2019-06-02 06:59:46
【问题描述】:

我有一个类,它有一个通用 List 作为属性,我必须对其进行初始化,并且它有一个使用该列表返回卡片的函数:

class buildCard{
buildCard(this.list);
final List list;

Widget buildCard(int position) {
      return Card(child: ListTile(title: list[position].name,),);
}

现在,如你所见,我使用

 list[position].name 

这适用于我拥有的大多数东西,但是,如果我有一个没有“名称”作为键的列表,我会遇到一些麻烦。如何避免这个问题?

【问题讨论】:

    标签: list dictionary flutter key


    【解决方案1】:

    可以使用is查看类型

    Widget buildCard() {
      if(list[position].name is List) {
        return Card(child: ListTile(title: list[position][0].name,),); // or similar - I don't know your exact structure
      } else { 
        return Card(child: ListTile(title: list[position].name,),);
      }
    }
    

    【讨论】:

    • 我不明白。如果您要检查“name”是否是该列表的有效键,为什么要检查它是否是 List 类型?
    • 也许我不明白你的问题,但它没有提供太多信息。 “我将有一个没有“名称”作为键的列表”没有多大意义,因为 List 没有 name 属性。
    • 是的,对不起。 List 实际上是 List 之类的人员列表,并且 Person 具有“名称”属性。所以,我想知道如何概括它,以防万一我有一个没有“名称”属性的 List
    • 你不能检查它是否有属性,你可以检查它是否是特定类型的。 if(list[position] is Person) {...} else if(list[position] is Stuff) { ...}
    • 你可以创建一个接口abstract class NamedItem { String get name; }并使用class Person implements NamedItem {...}和class Pet implements NamedItem {...}然后只检查if(list[position] is NamedItem) {...} else {...}
    【解决方案2】:

    你必须混合之前的两个答案才能得到你想要的(感谢@GünterZöchbauer)

    abstract class Named {
      String name;
    }
    
    class Person implements Named {
      String name;
    
      Person(this.name);
    }
    
    class NotAPerson {
      String noName;
    
      NotAPerson(this.noName);
    }
    
    class BuildCard {
      BuildCard(this.list);
      final List list;
    
      Widget buildCard(int position) {
        if(list[position] is Named) {
          return Card(child: ListTile(title: list[position].name,),);
        } else { 
          return Card(child: ListTile(title: list[position].noName,),);
        }
      }
    }
    
    main() {
      BuildCard b = BuildCard([Person, NotAPerson]);
      b.buildCard(0); // Will access name
      b.buildCard(1); // Will not access name
    }
    

    【讨论】:

      【解决方案3】:

      您可以限制您的 List,以便只能传入具有 name 属性的对象。

      abstract class Named {
          Widget name;
      }
      
      class buildCard {
          buildCard(this.list);
          final List<Named> list;
      
          Widget buildCard(int position) {
            return Card(child: ListTile(title: list[position].name,),);
          }
      }
      

      【讨论】:

      • 我不知道这个,但问题是我想达到相反的效果,我不想限制我的列表,但我想“概括”它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多