Flutter 颤振:如何从其他状态/页面/类访问数据
我有两个JSON文件,如下所示: json1(): json2(): 到目前为止,我已经做了2页如下: 下一步,当我点击第2页的Flutter 颤振:如何从其他状态/页面/类访问数据,flutter,dart,Flutter,Dart,我有两个JSON文件,如下所示: json1(): json2(): 到目前为止,我已经做了2页如下: 下一步,当我点击第2页的raised按钮时,我想查看第1页的内容,如下所示 所以请帮助我,这是第一页的文件 import 'package:flutter/material.dart'; import 'package:load_data/model/json2_model.dart'; import 'package:load_data/service/json1_service.dar
raised按钮时,我想查看第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())],
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:load_data/model/json2_model.dart”;
导入“package:load_data/service/json1_service.dart”;
导入“package:load_data/service/json2_service.dart”;
导入“package:load_data/shared/drawer.dart”;
导入“model/json1_model.dart”;
类Json1Page扩展StatefulWidget{
静态常量字符串routeName='/json1';
@凌驾
_Json1PageState createState();
}
类Json1PageState扩展了状态{
列表json1=[];
列表json2=[];
@凌驾
void initState(){
super.initState();
设置状态(){
Json1Services.getData().then((数据){
设置状态(){
json1=数据;
});
});
Json2Services.getData().then((数据){
设置状态(){
json2=数据;
});
});
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
抽屉:AppDrawer(),
appBar:appBar(标题:文本(“第1页”),
正文:专栏(
儿童:[
用于(Json1中的Json1 j1)
填充物(
填充:常数边集全部(8.0),
孩子:排(
儿童:[
已展开(子项:文本(j1.json1Language)),
已展开(子项:文本(j1.json1Code)),
扩大(
孩子:ShowCountry(
json2:List.from(json2)…retainWhere((e)=>e.json2Language.contains(j1.json1Language)),
),
)
],
),
)
],
));
}
}
类ShowCountry扩展了无状态小部件{
最终清单json2;
const ShowCountry({Key-Key,this.json2}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回列(
children:[对于(Json2中的Json2 j2)文本(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,
))),
],
),
],
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:load_data/model/json2_model.dart”;
导入“package:load_data/service/json1_service.dart”;
导入“package:load_data/service/json2_service.dart”;
导入“package:load_data/shared/drawer.dart”;
导入“model/json1_model.dart”;
类Json2Page扩展StatefulWidget{
静态常量字符串routeName='/json2';
@凌驾
_Json2PageState createState();
}
类_Json2PageState扩展了状态{
列表json2=[];
列表_大陆=[];
@凌驾
void initState(){
super.initState();
设置状态(){
Json2Services.getData().then((数据){
设置状态(){
json2=数据;
_大陆=json2.map((x)=>x.json2大陆).toSet().toList();
});
});
});
}
@凌驾
小部件构建(构建上下文){
返回DefaultTabController(
长度:_.length,
孩子:脚手架(
抽屉:AppDrawer(),
appBar:appBar(
标题:正文(“第2页”),
底部:选项卡栏(选项卡:_contraction.map((字符串名称)=>Tab(文本名称)).toList(),
),
正文:选项卡视图(
子项:_contraction.map((字符串名称){
返回showcontrante(json2:List.from(json2)…retainWhere((e)=>e.json2contrante==name));
}).toList()),
));
}
}
类ShowContinents扩展StatefulWidget{
最终清单json2;
ShowContinental({this.json2});
@凌驾
_ShowContinentState createState()=>\u ShowContinentState(json2);
}
类(状态扩展状态){
最终清单json2;
列表json1=[];
_ShowState(this.json2);
@凌驾
void initState(){
super.initState();
Json1Services.getData().then((数据){
设置状态(){
json1=数据;
});
});
}
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
用于(Json2中的Json2 j2)
划船(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
文本(j2.json2Country.toUpperCase()),
对于(int i=0;i
显示对话框(
上下文:上下文,
建筑商:(\u)=>
新建警报对话框(
内容:空,
))),
],
),
],
);
}
}
您可以复制粘贴运行下面的完整代码
您可以将所有的json2
传递到showcontricent
并进行筛选
代码片段
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, )
],
),
)
返回(
json2:List.from(json2)
…保留其中((e)=>e.json2contentent==名称),
所有json2:json2);
...
类ShowContinents扩展StatefulWidget{
最终列出所有JSON2;
最终清单json2;
showcontrance({this.json2,this.allJson2});
...
建筑商:(){
int index=json1.indexWhere(
(j1)=>j1.JSON1语言==j2.JSON2语言[i];
列表j3=widget.allJson2
.其中((element)=>element.json2Language
.contains(j2.json2Language[i]))
.toList();
打印(j3.长度);
返回警报对话框(
内容:SizedBox(
宽度:300,
身高:70,
孩子:排(
儿童:[
扩大(
child:Text(json1[index].json1Language)),
扩展(chi)
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,
))),
],
),
],
);
}
}
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(),
);
}
}