我有2个这样的JSON文件:
json1(API):
[
{
"json1Language": "English",
"json1Code": "en"
},
{
"json1Language": "French",
"json1Code": "fr"
},
{
"json1Language": "Spanish",
"json1Code": "es"
}
]
json2(API):
[
{
"json2Country": "Canada",
"json2Continent": "North American",
"json2Language": [
"French",
"English"
]
},
{
"json2Country": "Mexico",
"json2Continent": "North American",
"json2Language": [
"Spanish",
"English"
]
},
{
"json2Country": "United Kingdom",
"json2Continent": "Europe",
"json2Language": [
"English"
]
},
{
"json2Country": "France",
"json2Continent": "Europe",
"json2Language": [
"French"
]
},
{
"json2Country": "Spain",
"json2Continent": "Europe",
"json2Language": [
"Spanish"
]
}
]
下一步,我想当我单击页面2的RaisedButton
=> showDialog
时,页面1的内容如下
所以请帮助我,这是第1页文件
import 'package:flutter/material.dart';
import 'package:load_data/model/json2_model.dart';
import 'package:load_data/service/json1_service.dart';
import 'package:load_data/service/json2_service.dart';
import 'package:load_data/shared/drawer.dart';
import 'model/json1_model.dart';
class Json1Page extends StatefulWidget {
static const String routeName = '/json1';
@override
_Json1PageState createState() => _Json1PageState();
}
class _Json1PageState extends State<Json1Page> {
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(
drawer: AppDrawer(),
appBar: AppBar(title: Text('Page 1')),
body: Column(
children: [
for (Json1 j1 in json1)
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Expanded(child: Text(j1.json1Language)),
Expanded(child: Text(j1.json1Code)),
Expanded(
child: ShowCountry(
json2: List<Json2>.from(json2)..retainWhere((e) => e.json2Language.contains(j1.json1Language)),
),
)
],
),
)
],
));
}
}
class ShowCountry extends StatelessWidget {
final List<Json2> json2;
const ShowCountry({Key key, this.json2}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
children: [for (Json2 j2 in json2) Text(j2.json2Country.toUpperCase())],
);
}
}
这是第2页文件
import 'package:flutter/material.dart';
import 'package:load_data/model/json2_model.dart';
import 'package:load_data/service/json1_service.dart';
import 'package:load_data/service/json2_service.dart';
import 'package:load_data/shared/drawer.dart';
import 'model/json1_model.dart';
class Json2Page extends StatefulWidget {
static const String routeName = '/json2';
@override
_Json2PageState createState() => _Json2PageState();
}
class _Json2PageState extends State<Json2Page> {
List<Json2> json2 = [];
List<String> _continent = [];
@override
void initState() {
super.initState();
setState(() {
Json2Services.getData().then((data) {
setState(() {
json2 = data;
_continent = json2.map<String>((x) => x.json2Continent).toSet().toList();
});
});
});
}
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: _continent.length,
child: Scaffold(
drawer: AppDrawer(),
appBar: AppBar(
title: Text('Page 2'),
bottom: TabBar(tabs: _continent.map((String name) => Tab(text: name)).toList()),
),
body: TabBarView(
children: _continent.map((String name) {
return ShowContinent(json2: List<Json2>.from(json2)..retainWhere((e) => e.json2Continent == name));
}).toList()),
));
}
}
class ShowContinent extends StatefulWidget {
final List<Json2> json2;
ShowContinent({this.json2});
@override
_ShowContinentState createState() => _ShowContinentState(json2);
}
class _ShowContinentState extends State<ShowContinent> {
final List<Json2> json2;
List<Json1> json1 = [];
_ShowContinentState(this.json2);
@override
void initState() {
super.initState();
Json1Services.getData().then((data) {
setState(() {
json1 = data;
});
});
}
@override
Widget build(BuildContext context) {
return Column(
children: [
for (Json2 j2 in json2)
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(j2.json2Country.toUpperCase()),
for (int i = 0; i < j2.json2Language.length; i++)
RaisedButton(
child: (Text(j2.json2Language[i])),
onPressed: () =>
showDialog(
context: context,
builder: (_) =>
new AlertDialog(
content: null,
))),
],
),
],
);
}
}
答案 0 :(得分:1)
您可以在下面复制粘贴运行完整代码
您可以将所有json2
传递给ShowContinent
并进行过滤
代码段
return ShowContinent(
json2: List<Json2>.from(json2)
..retainWhere((e) => e.json2Continent == name),
allJson2: json2);
...
class ShowContinent extends StatefulWidget {
final List<Json2> allJson2;
final List<Json2> json2;
ShowContinent({this.json2, this.allJson2});
...
builder: (_) {
int index = json1.indexWhere(
(j1) => j1.json1Language == j2.json2Language[i]);
List<Json2> j3 = widget.allJson2
.where((element) => element.json2Language
.contains(j2.json2Language[i]))
.toList();
print(j3.length);
return AlertDialog(
content: SizedBox(
width: 300,
height: 70,
child: Row(
children: [
Expanded(
child: Text(json1[index].json1Language)),
Expanded(child: Text(json1[index].json1Code)),
Expanded(
flex: 2,
child: Column(
mainAxisAlignment:
MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
for (int i = 0; i < j3.length; i++)
Text(j3[i].json2Country, )
],
),
)
工作演示
完整代码
import 'package:flutter/material.dart';
import 'dart:convert';
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())));
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,
this.json1Code,
});
String json1Language;
String json1Code;
factory Json1.fromJson(Map<String, dynamic> json) => Json1(
json1Language: json["json1Language"],
json1Code: json["json1Code"],
);
Map<String, dynamic> toJson() => {
"json1Language": json1Language,
"json1Code": json1Code,
};
}
class Json2 {
Json2({
this.json2Country,
this.json2Continent,
this.json2Language,
});
String json2Country;
String json2Continent;
List<String> json2Language;
factory Json2.fromJson(Map<String, dynamic> json) => Json2(
json2Country: json["json2Country"],
json2Continent: json["json2Continent"],
json2Language: List<String>.from(json["json2Language"].map((x) => x)),
);
Map<String, dynamic> toJson() => {
"json2Country": json2Country,
"json2Continent": json2Continent,
"json2Language": List<dynamic>.from(json2Language.map((x) => x)),
};
}
class Json2Services {
static Future<List<Json2>> getData() {
String jsonString = '''
[
{
"json2Country": "Canada",
"json2Continent": "North American",
"json2Language": [
"French",
"English"
]
},
{
"json2Country": "Mexico",
"json2Continent": "North American",
"json2Language": [
"Spanish",
"English"
]
},
{
"json2Country": "United Kingdom",
"json2Continent": "Europe",
"json2Language": [
"English"
]
},
{
"json2Country": "France",
"json2Continent": "Europe",
"json2Language": [
"French"
]
},
{
"json2Country": "Spain",
"json2Continent": "Europe",
"json2Language": [
"Spanish"
]
}
]
''';
return Future.value(json2FromJson(jsonString));
}
}
class Json1Services {
static Future<List<Json1>> getData() {
String jsonString = '''
[
{
"json1Language": "English",
"json1Code": "en"
},
{
"json1Language": "French",
"json1Code": "fr"
},
{
"json1Language": "Spanish",
"json1Code": "es"
}
]
''';
return Future.value(json1FromJson(jsonString));
}
}
class Json2Page extends StatefulWidget {
static const String routeName = '/json2';
@override
_Json2PageState createState() => _Json2PageState();
}
class _Json2PageState extends State<Json2Page> {
List<Json2> json2 = [];
List<String> _continent = [];
@override
void initState() {
super.initState();
setState(() {
Json2Services.getData().then((data) {
setState(() {
json2 = data;
_continent =
json2.map<String>((x) => x.json2Continent).toSet().toList();
});
});
});
}
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: _continent.length,
child: Scaffold(
//drawer: AppDrawer(),
appBar: AppBar(
title: Text('Page 2'),
bottom: TabBar(
tabs:
_continent.map((String name) => Tab(text: name)).toList()),
),
body: TabBarView(
children: _continent.map((String name) {
return ShowContinent(
json2: List<Json2>.from(json2)
..retainWhere((e) => e.json2Continent == name),
allJson2: json2);
}).toList()),
));
}
}
class ShowContinent extends StatefulWidget {
final List<Json2> allJson2;
final List<Json2> json2;
ShowContinent({this.json2, this.allJson2});
@override
_ShowContinentState createState() => _ShowContinentState(json2);
}
class _ShowContinentState extends State<ShowContinent> {
final List<Json2> json2;
List<Json1> json1 = [];
_ShowContinentState(this.json2);
@override
void initState() {
super.initState();
Json1Services.getData().then((data) {
setState(() {
json1 = data;
});
});
}
@override
Widget build(BuildContext context) {
return Column(
children: [
for (Json2 j2 in json2)
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(j2.json2Country.toUpperCase()),
for (int i = 0; i < j2.json2Language.length; i++)
RaisedButton(
child: (Text(j2.json2Language[i])),
onPressed: () => showDialog(
context: context,
builder: (_) {
int index = json1.indexWhere(
(j1) => j1.json1Language == j2.json2Language[i]);
List<Json2> j3 = widget.allJson2
.where((element) => element.json2Language
.contains(j2.json2Language[i]))
.toList();
print(j3.length);
return AlertDialog(
content: SizedBox(
width: 300,
height: 70,
child: Row(
children: [
Expanded(
child: Text(json1[index].json1Language)),
Expanded(child: Text(json1[index].json1Code)),
Expanded(
flex: 2,
child: Column(
mainAxisAlignment:
MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
for (int i = 0; i < j3.length; i++)
Text(j3[i].json2Country, )
],
),
)
],
),
),
);
})),
],
),
],
);
}
}
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: Json2Page(),
);
}
}