【问题标题】:Flutter: How to use forEach method for this dataFlutter:如何对这些数据使用 forEach 方法
【发布时间】:2020-09-18 01:22:29
【问题描述】:

我有 2 个 JSON 文件:

Json1 文件:

[
  {
    "json1language": "English"
  },
  {
    "json1language": "French"
  },
  {
    "json1language": "Spanish"
  }
]

Json2 文件:

[
  {
    "json2country": "Canada",
    "json2languages": [
      {
        "json2language": "English"
      },
      {
        "json2language": "French"
      }
    ]
  },
  {
    "json2country": "Mexico",
    "json2languages": [
      {
        "json2language": "English"
      },
      {
        "json2language": "Spanish"
      }
    ]
  },
  {
    "json2country": "France",
    "json2languages": [
      {
        "json2language": "French"
      }
    ]
  }
]

我希望当我点击json1language => showDialog 时显示json2countryjson2language 匹配条件json2language == json1language

示例:单击“英语”=> 显示 json2country:“加拿大”; json2language: "英语","法语" & json2country: "墨西哥"; json2language: "English","Spanish" (因为 json2language 包含 "English")

所以请帮帮我,这是主文件

import 'package:flutter/material.dart';

import 'dart:convert';

List<Json1> json1FromJson(String str) => List<Json1>.from(json.decode(str).map((x) => Json1.fromJson(x)));

String json1ToJson(List<Json1> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Json1 {
  Json1({
    this.json1Language,
  });

  String json1Language;

  factory Json1.fromJson(Map<String, dynamic> json) => Json1(
        json1Language: json["json1language"],
      );

  Map<String, dynamic> toJson() => {
        "json1language": json1Language,
      };
}

List<Json2> json2FromJson(String str) => List<Json2>.from(json.decode(str).map((x) => Json2.fromJson(x)));

String json2ToJson(List<Json2> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Json2 {
  Json2({
    this.json2Country,
    this.json2Languages,
  });

  String json2Country;
  List<Json2Language> json2Languages;

  factory Json2.fromJson(Map<String, dynamic> json) => Json2(
        json2Country: json["json2country"],
        json2Languages: List<Json2Language>.from(json["json2languages"].map((x) => Json2Language.fromJson(x))),
      );

  Map<String, dynamic> toJson() => {
        "json2country": json2Country,
        "json2languages": List<dynamic>.from(json2Languages.map((x) => x.toJson())),
      };
}

class Json2Language {
  Json2Language({
    this.json2Language,
  });

  String json2Language;

  factory Json2Language.fromJson(Map<String, dynamic> json) => Json2Language(
        json2Language: json["json2language"],
      );

  Map<String, dynamic> toJson() => {
        "json2language": json2Language,
      };
}

class Json1Services {
  static Future<List<Json1>> getData() {
    String jsonString = '''
[
  {
    "json1language": "English"
  },
  {
    "json1language": "French"
  },
  {
    "json1language": "Spanish"
  }
]
    ''';

    return Future.value(json1FromJson(jsonString));
  }
}

class Json2Services {
  static Future<List<Json2>> getData() {
    String jsonString = '''
    [
  {
    "json2country": "Canada",
    "json2languages": [
      {
        "json2language": "English"
      },
      {
        "json2language": "French"
      }
    ]
  },
  {
    "json2country": "Mexico",
    "json2languages": [
      {
        "json2language": "English"
      },
      {
        "json2language": "Spanish"
      }
    ]
  },
  {
    "json2country": "France",
    "json2languages": [
      {
        "json2language": "French"
      }
    ]
  }
]
    ''';

    return Future.value(json2FromJson(jsonString));
  }
}

class Json extends StatefulWidget {
  @override
  _JsonState createState() => _JsonState();
}

class _JsonState extends State<Json> {
  List<Json1> _json1 = [];
  List<Json2> _json2 = [];
  @override
  void initState() {
    super.initState();
    setState(() {
      Json1Services.getData().then((data) {
        setState(() {
          _json1 = data;
        });
      });
      Json2Services.getData().then((data) {
        setState(() {
          _json2 = data;
        });
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(),
        body: SingleChildScrollView(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              for (Json1 j1 in _json1)
                RaisedButton(
                    child: Text(j1.json1Language),
                    onPressed: () => showDialog(
                        context: context,
                        builder: (_) {
                          return AlertDialog(
                            content: null,
                          );
                        }))
            ],
          ),
        ));
  }
}

【问题讨论】:

  • 您只需要一个Map&lt;String, Set&lt;Json2&gt;&gt;- 这里String 键是一个语言名称,您的工作是从现有数据中填充它
  • @pskink 你能给我完整的代码吗?我真的是一个编码新手

标签: flutter dart


【解决方案1】:

您可以在下面复制粘贴运行完整代码
代码sn-p

filtered = [];
      _json2.forEach((element) {
        for (int i = 0;
            i < element.json2Languages.length;
            i++) {
          if (element.json2Languages[i].json2Language ==
              j1.json1Language) {
            filtered.add(element);
          }
        }
      });
      
...

return AlertDialog(
            content: SizedBox(
              width: 300,
              height: 70,
              child: Row(
                children: [
                  Expanded(
                    flex: 2,
                    child: Column(
                      mainAxisAlignment:
                          MainAxisAlignment.spaceAround,
                      crossAxisAlignment:
                          CrossAxisAlignment.center,
                      children: [
                        for (int i = 0;
                            i < filtered.length;
                            i++)
                          Row(
                            mainAxisAlignment:
                                MainAxisAlignment.spaceBetween,
                            children: [
                              Text(
                                filtered[i].json2Country,
                              ),
                              for (int j = 0;
                                  j <
                                      filtered[i]
                                          .json2Languages
                                          .length;
                                  j++)
                                Column(children: [
                                  Text(filtered[i]
                                      .json2Languages[j]
                                      .json2Language)
                                ]),
                            ],    

工作演示

完整代码

import 'package:flutter/material.dart';
import 'package:flutter/material.dart';

import 'dart:convert';

List<Json1> json1FromJson(String str) =>
    List<Json1>.from(json.decode(str).map((x) => Json1.fromJson(x)));

String json1ToJson(List<Json1> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Json1 {
  Json1({
    this.json1Language,
  });

  String json1Language;

  factory Json1.fromJson(Map<String, dynamic> json) => Json1(
        json1Language: json["json1language"],
      );

  Map<String, dynamic> toJson() => {
        "json1language": json1Language,
      };
}

List<Json2> json2FromJson(String str) =>
    List<Json2>.from(json.decode(str).map((x) => Json2.fromJson(x)));

String json2ToJson(List<Json2> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Json2 {
  Json2({
    this.json2Country,
    this.json2Languages,
  });

  String json2Country;
  List<Json2Language> json2Languages;

  factory Json2.fromJson(Map<String, dynamic> json) => Json2(
        json2Country: json["json2country"],
        json2Languages: List<Json2Language>.from(
            json["json2languages"].map((x) => Json2Language.fromJson(x))),
      );

  Map<String, dynamic> toJson() => {
        "json2country": json2Country,
        "json2languages":
            List<dynamic>.from(json2Languages.map((x) => x.toJson())),
      };
}

class Json2Language {
  Json2Language({
    this.json2Language,
  });

  String json2Language;

  factory Json2Language.fromJson(Map<String, dynamic> json) => Json2Language(
        json2Language: json["json2language"],
      );

  Map<String, dynamic> toJson() => {
        "json2language": json2Language,
      };
}

class Json1Services {
  static Future<List<Json1>> getData() {
    String jsonString = '''
[
  {
    "json1language": "English"
  },
  {
    "json1language": "French"
  },
  {
    "json1language": "Spanish"
  }
]
    ''';

    return Future.value(json1FromJson(jsonString));
  }
}

class Json2Services {
  static Future<List<Json2>> getData() {
    String jsonString = '''
    [
  {
    "json2country": "Canada",
    "json2languages": [
      {
        "json2language": "English"
      },
      {
        "json2language": "French"
      }
    ]
  },
  {
    "json2country": "Mexico",
    "json2languages": [
      {
        "json2language": "English"
      },
      {
        "json2language": "Spanish"
      }
    ]
  },
  {
    "json2country": "France",
    "json2languages": [
      {
        "json2language": "French"
      }
    ]
  }
]
    ''';

    return Future.value(json2FromJson(jsonString));
  }
}

class Json extends StatefulWidget {
  @override
  _JsonState createState() => _JsonState();
}

class _JsonState extends State<Json> {
  List<Json1> _json1 = [];
  List<Json2> _json2 = [];
  @override
  void initState() {
    super.initState();
    setState(() {
      Json1Services.getData().then((data) {
        setState(() {
          _json1 = data;
        });
      });
      Json2Services.getData().then((data) {
        setState(() {
          _json2 = data;
        });
      });
    });
  }

  List<Json2> filtered = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(),
        body: SingleChildScrollView(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              for (Json1 j1 in _json1)
                RaisedButton(
                    child: Text(j1.json1Language),
                    onPressed: () => showDialog(
                        context: context,
                        builder: (_) {
                          filtered = [];
                          _json2.forEach((element) {
                            for (int i = 0;
                                i < element.json2Languages.length;
                                i++) {
                              if (element.json2Languages[i].json2Language ==
                                  j1.json1Language) {
                                filtered.add(element);
                              }
                            }
                          });

                          return AlertDialog(
                            content: SizedBox(
                              width: 300,
                              height: 70,
                              child: Row(
                                children: [
                                  Expanded(
                                    flex: 2,
                                    child: Column(
                                      mainAxisAlignment:
                                          MainAxisAlignment.spaceAround,
                                      crossAxisAlignment:
                                          CrossAxisAlignment.center,
                                      children: [
                                        for (int i = 0;
                                            i < filtered.length;
                                            i++)
                                          Row(
                                            mainAxisAlignment:
                                                MainAxisAlignment.spaceBetween,
                                            children: [
                                              Text(
                                                filtered[i].json2Country,
                                              ),
                                              for (int j = 0;
                                                  j <
                                                      filtered[i]
                                                          .json2Languages
                                                          .length;
                                                  j++)
                                                Column(children: [
                                                  Text(filtered[i]
                                                      .json2Languages[j]
                                                      .json2Language)
                                                ]),
                                            ],
                                          )
                                      ],
                                    ),
                                  )
                                ],
                              ),
                            ),
                          );
                        }))
            ],
          ),
        ));
  }
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Json(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

【讨论】:

  • 我从你那里学到了另一个很棒的方法,你是最好的xD
猜你喜欢
  • 1970-01-01
  • 2019-10-01
  • 2014-12-12
  • 1970-01-01
  • 2020-08-31
  • 2019-08-09
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多