Flutter 颤振:如何从其他状态/页面/类访问数据

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

我有两个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.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(),
    );
  }
}