【问题标题】:iterate trough map<List<dataModel>> in Dart Flutter在 Dart Flutter 中遍历 map<List<data Model>>
【发布时间】:2020-12-14 15:30:44
【问题描述】:

我有 2 个数据模型。 userDataModelPostDataModel

用户可能有多个帖子 所以我想有以下获取结构:

Map<userDataModel,List<PostDataModel>> = data

我可以使用索引遍历数据吗? (用户索引,然后发布索引?)

类似for(user, data in data){} 或类似data[0][0] 最后,我想要一个所有帖子的列表视图,当时只有一个用户

我也想知道如何打印数据,因为打印数据只返回实例。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    首先,使用您提供的结构Map&lt;userDataModel,List&lt;PostDataModel&gt;&gt;,您必须有两个嵌套循环。为了能够遍历所有这些,您将需要一些类似以下的代码:

    void main() {
      var data = Map<UserDataModel, List<PostDataModel>>();
      
     data.forEach((user, posts) {
       for (var post in posts) {
         print(post.name);
         print(user.id);
       }
     });
    }
    
    class UserDataModel {
      int id;
    }
    
    class PostDataModel {
      String name;
    }
    

    但是,正如您提到的,由于您的帖子属于用户,我会将PostDataModel 放在UserDataModel 中。然后,您的数据最终看起来会有些不同:

    void main() {
      var data = List<UserDataModel>();
      
      data.add(UserDataModel(1, [PostDataModel("one"),PostDataModel("two")]));
      data.add(UserDataModel(2, [PostDataModel("three"),PostDataModel("four")]));
      
     for (var user in data) {
       for (var post in user.posts) {
          print(user);
          print(post);
       }
     }
    }
    
    class UserDataModel {
      int id;
      
      UserDataModel(this.id, this.posts);
      
      List<PostDataModel> posts;
      
      @override
      String toString() {
        var result = "";
        
        result += "Id: $id\n";
        
        var count = 0;
        for(var post in posts) {
          result += "Post $count, $post";
        }
        
        return result;
      }
    }
    
    class PostDataModel {
      String name;
      
      PostDataModel(this.name);
      
      @override
      String toString() {
        return "Name: $name\n";
      }
    }
    

    这取决于您的后端结构,但我建议采用第二种方式。

    作为问题第二部分的答案,请查看方法toString。如果您覆盖它,您可以自定义类的显示方式,例如,当您使用print(userDataModel 时。例如,我创建了这些类,因此请为您自己的类定制它们。

    事实上,在最后一个示例中,您可以按照自己的要求通过data[0].posts[0] 访问您的帖子。

    【讨论】:

    • 我很高兴有帮助!
    【解决方案2】:

    我猜你可以做类似的事情

    var data = userDataModel.map((user) =&gt; postDataModel.map((post) { post.useriD == user.userId ? post : null}).toList()).toList();

    【讨论】:

      【解决方案3】:

      一种可能的解决方案是在嵌套的forEach 中迭代MapList

      data.forEach((user, posts) {
       print(user);
       posts.forEach((post) {
          print(post);
       });
       print('---'); // end of the user's posts
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-03
        • 2023-01-25
        • 2020-12-18
        • 1970-01-01
        • 1970-01-01
        • 2017-07-21
        • 2013-05-17
        • 2018-03-19
        相关资源
        最近更新 更多