Flutter: как отображать данные из 2 JSON на основе одного и того же значения Array - PullRequest
0 голосов
/ 02 августа 2020

У меня есть 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"
    ]
  }
]

Я хочу, чтобы при нажатии на имя человека => показывались подходящие наряды

Пример. Джордж надевает футболку и шляпу

введите описание изображения здесь

Так что, пожалуйста, помогите мне, это главный файл:

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),
      ],
    );
  }
}

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

1 Ответ

1 голос
/ 03 августа 2020
List<Json2>.from(_json2)..retainWhere((element) => element.fit[index] == json1.name))

retainWhere будет проверять каждый элемент и сохранять только те, для которых выполняется условие. проблема в том, что element.fit[index] == json1.name просто проверьте элемент по индексу index списка fit и сравнивает его с именем json1.name, на самом деле не проверяет, есть ли имя в списке fit. Попробуйте:

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

Это будет перебирать каждый элемент в json2, затем проверять, содержит ли список fit одинаковый объект json1.name и возвращает true, если он есть, иначе false

...