簡體   English   中英

Flutter:如何根據Array的相同值顯示來自2 JSON的數據

[英]Flutter: How to display data from 2 JSON based on the same value of Array

我有 2 JSON 文件:

json1:字符串人名( API

[
  {
    "name": "Oliver"
  },
  {
    "name": "George"
  },
  {
    "name": "Harry"
  }
]

json2:字符串裝備和一組適合該裝備的人( API

[
  {
    "outfit": "T-shirt",
    "fit": [
      "Oliver",
      "George"
    ]
  },
  {
    "outfit": "Hat",
    "fit": [
      "George",
      "Harry"
    ]
  },
  {
    "outfit": "Jacket",
    "fit": [
      "Harry"
    ]
  }
]

我希望在單擊此人的姓名時顯示 => 顯示適合他們的服裝

前任。 喬治適合一件 T 恤和一頂帽子

在此處輸入圖像描述

所以請幫助我,這是主要文件:

import 'package:ask/model/page1_model.dart';
import 'package:ask/model/page2_model.dart';
import 'package:ask/services/json2_service.dart';
import 'package:ask/services/json1_service.dart';
import 'package:flutter/material.dart';

class Demo extends StatefulWidget {
  @override
  _DemoState createState() => _DemoState();
}

class _DemoState extends State<Demo> {
  List<Json1> _json1 = [];
  List<Json2> _json2 = [];

  @override
  void initState() {
    super.initState();
    Json1Services.getData().then((data) {
      setState(() {
        _json1 = data;
      });
    });
    Json2Services.getData().then((data) {
      setState(() {
        _json2 = data;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text('List Name')),
        body: ListView.builder(
          itemCount: _json1.length,
          itemBuilder: (BuildContext context, int index) {
            Json1 json1 = _json1[index];
            return Column(children: [
              InkWell(
                  child: Text(json1.name),
                  onTap: () => Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => Scaffold(
                                appBar: AppBar(title: Text('${json1.name} fits:')),
                                body: ShowWhatFit(json2: List<Json2>.from(_json2)..retainWhere((element) => element.fit[index] == json1.name)), // I think this line is not right
                              ))))
            ]);
          },
        ));
  }
}

class ShowWhatFit extends StatelessWidget {
  final List<Json2> json2;
  ShowWhatFit({this.json2});

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        for (int i = 0; i < json2.length; i++) Text(json2[i].outfit),
      ],
    );
  }
}

..................................................... .....................................

List<Json2>.from(_json2)..retainWhere((element) => element.fit[index] == json1.name))

retainWhere將檢查每個元素並僅保留條件為真的元素。 問題是element.fit[index] == json1.name只是檢查列表fit的索引index處的元素並將其與名稱json1.name進行比較,並沒有真正檢查名稱是否在列表fit中。 嘗試:

List<Json2>.from(_json2)..retainWhere((element) => element.fit.contains(json1.name)))

這將迭代 json2 中的每個元素,然后檢查列表是否包含一個相等的fit json1.name ,如果存在則返回 true,否則返回 false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM