Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振传递数据到Statefulwidget_Flutter_Dart - Fatal编程技术网

Flutter 颤振传递数据到Statefulwidget

Flutter 颤振传递数据到Statefulwidget,flutter,dart,Flutter,Dart,我需要知道如何通过屏幕传递数据 下面是我发送数据的方式 class _HomePageState extends State<HomePage> { @override initState() { // TODO: implement initState super.initState(); doSomeAsyncStuff(); } Future<List> doSomeAsyncStuff() async { f

我需要知道如何通过屏幕传递数据

下面是我发送数据的方式

 class _HomePageState extends State<HomePage> {

  @override
  initState() {
    // TODO: implement initState

    super.initState();
    doSomeAsyncStuff();
  }

  Future<List> doSomeAsyncStuff() async {
    final storage = new FlutterSecureStorage();
    String value = await storage.read(key: 'Cnic');
    print(value);

    String url = 'http://api.igiinsurance.com.pk:8888/insurance_IgiGen/insurance-api/get_company_employee.php?offset=0&limit=1&cnic=${value}' ;
    final msg = jsonEncode({"cnic": value});
    Map<String,String> headers = {'Content-Type':'application/json'};

    String token = value;
    final response = await http.get(url);

    var Data = json.decode(response.body);
    print(Data);

    var familyMembers = Data["records"][0]["family_members"];
    print(familyMembers);
    for (var familyMember in familyMembers){ //prints the name of each family member
      var familyMemberName = familyMember["name"];
      var familyMemberGender = familyMember["gender"];
      var familyMemberAge = familyMember["age"];
      var familyMemberRelationship = familyMember["relationship"];
      print(familyMemberName);
    }

  }
  
  @override
  Widget build(BuildContext context) {
    double statusBarHeight = MediaQuery.of(context).padding.top;
    double width = MediaQuery.of(context).size.width;
    double height = MediaQuery.of(context).size.height;

   
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        automaticallyImplyLeading: false,
        title: Text('IGI GENERAL INSURANCE'),
      ),
      body: Center(
        child: GestureDetector(
          onTap: (){
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => PersonalPage(familyMemberName, familyMemberGender)),
            );
          },
          child: Column(
            children: <Widget>[
              ClipRRect(
                  borderRadius: BorderRadius.circular(35),
                  child: Image(
                    image: AssetImage("assets/images/reg.png"),
                    height: height * 0.1,
                  )),
              Text(
                'Personal',
                style: TextStyle(
                    fontSize: 17, fontWeight: FontWeight.bold),
              )
            ],
          ),
        ),
      )
    );
  }
}
现在我想在另一个有状态小部件中显示该值

class PersonalPage extends StatefulWidget {
  @override
  _PersonalPageState createState() => _PersonalPageState();
}

class _PersonalPageState extends State<PersonalPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Text('Show name here '),
          Text('Show gender here ')
        ],
      ),
    );
  }
}
class PersonalPage扩展StatefulWidget{
@凌驾
_PersonalPageState createState()=>\u PersonalPageState();
}
类_PersonalPageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
儿童:[
文本(“在此处显示名称”),
文本('在此处显示性别')
],
),
);
}
}
正如您所看到的,我将值传递给另一个有状态小部件。我现在需要在文本小部件中显示该值


添加了_homeState,现在也是一个问题

您可以使用
PersonalPage
类的构造函数接收值:

import "package:flutter/material.dart";

class PersonalPage extends StatefulWidget {
  final List<String> names;
  final List<String> genders;
  PersonalPage(this.names,this.genders); 
  @override
  _PersonalPageState createState() => _PersonalPageState();
}

class _PersonalPageState extends State<PersonalPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: 
ListView.builder( //use ListView here to show all the names and genders
itemCount: widget.names.length,
itemBuilder: (BuildContext context,int index){
  return ListTile(
          title: Text(widget.names[index]),
          subtitle: Text(widget.genders[index])
        ],
      );
})
  );
  }
}

您可以使用
PersonalPage
类的构造函数接收值:

import "package:flutter/material.dart";

class PersonalPage extends StatefulWidget {
  final List<String> names;
  final List<String> genders;
  PersonalPage(this.names,this.genders); 
  @override
  _PersonalPageState createState() => _PersonalPageState();
}

class _PersonalPageState extends State<PersonalPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: 
ListView.builder( //use ListView here to show all the names and genders
itemCount: widget.names.length,
itemBuilder: (BuildContext context,int index){
  return ListTile(
          title: Text(widget.names[index]),
          subtitle: Text(widget.genders[index])
        ],
      );
})
  );
  }
}

当我在类似此PersonalPage(familyMemberName,familyMemberGender)的函数中传递值时它在一个值中显示错误getter“familyMemberGender”没有为类“\u HomePageState”定义我在你的问题中看不到任何
\u HomePageState
类,但是你需要在函数外部和
\u HomePageState
类内部定义
familyMemberName
familyMemberGender
,只需分配它们在函数中的值错误的原因是变量的作用域在函数中,并且在函数完成后它们将被销毁。这就是为什么您需要在
\u HomePageState
类中定义它们,以便在调用onTap函数时可以使用这些值。您可以使用Listview生成器在PersonPage中显示所有名称,如下所示:Listview.builder(itemCount:names.length,shrinkWrap:true,itemguilder:(上下文,索引){return listile(标题:Text(名称[index]),副标题:Text(性别[index]),);}),我更新了
PersonalPage
code以及@jivanpatel建议的代码。请使用我们收到的代码2
List
,当我在类似于此PersonalPage的函数(familyMemberName,familyMemberGender)中传递值时,我们使用
ListView
显示所有姓名和性别它在一个值中显示错误getter“familyMemberGender”没有为类“\u HomePageState”定义我在你的问题中看不到任何
\u HomePageState
类,但是你需要在函数外部和
\u HomePageState
类内部定义
familyMemberName
familyMemberGender
,只需分配它们在函数中的值错误的原因是变量的作用域在函数中,并且在函数完成后它们将被销毁。这就是为什么需要在
\u HomePageState
类中定义它们,以便在调用onTap函数时这些值可用。您可以使用Listview生成器PersnolPage中的所有名称如下所示:ListView.builder(itemCount:names.length,shrinkWrap:true,itemBuilder:(上下文,索引){返回ListTile(标题:Text(名称[索引]),副标题:Text(genders[index]),;}),我更新了
PersonalPage
code以及@jivanpatel建议的代码。请使用我们收到的代码2
List
,我们使用
ListView
class _HomePageState extends State<HomePage> {
 //define your variables here so they are accessible throughout your widget tree
  List<String> familyMemberName = [];
  List<String> familyMemberGender = [];
  List<String> familyMemberAge = [];
  List<String> familyMemberRelationship = [];
  @override
  initState() {
    // TODO: implement initState

    super.initState();
    doSomeAsyncStuff();
  }

  Future<List> doSomeAsyncStuff() async {
    final storage = new FlutterSecureStorage();
    String value = await storage.read(key: 'Cnic');
    print(value);

    String url = 'http://api.igiinsurance.com.pk:8888/insurance_IgiGen/insurance-api/get_company_employee.php?offset=0&limit=1&cnic=${value}' ;
    final msg = jsonEncode({"cnic": value});
    Map<String,String> headers = {'Content-Type':'application/json'};

    String token = value;
    final response = await http.get(url);

    var Data = json.decode(response.body);
    print(Data);

    var familyMembers = Data["records"][0]["family_members"];
    print(familyMembers);
    for (var familyMember in familyMembers){ //prints the name of each family member
      //assign the values here
      familyMemberName.add(familyMember["name"]);
      familyMemberGender.add(familyMember["gender"]);
      familyMemberAge.add(familyMember["age"]);
      familyMemberRelationship.add(familyMember["relationship"]);
    }

  }
  
  @override
  Widget build(BuildContext context) {
    double statusBarHeight = MediaQuery.of(context).padding.top;
    double width = MediaQuery.of(context).size.width;
    double height = MediaQuery.of(context).size.height;

   
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        automaticallyImplyLeading: false,
        title: Text('IGI GENERAL INSURANCE'),
      ),
      body: Center(
        child: GestureDetector(
          onTap: (){
           if(familyMemberName.isNotEmpty() && familyMemberGender.isNotEmpty()){
            //we pass the lists here
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => PersonalPage(familyMemberName, familyMemberGender)),
} 
//only navigate to the new page if the values of familyMemberName and familyMemberGender are retrieved from the function(because your function returns a future so it might take sometimes before the values are assigned)

            );
          },
          child: Column(
            children: <Widget>[
              ClipRRect(
                  borderRadius: BorderRadius.circular(35),
                  child: Image(
                    image: AssetImage("assets/images/reg.png"),
                    height: height * 0.1,
                  )),
              Text(
                'Personal',
                style: TextStyle(
                    fontSize: 17, fontWeight: FontWeight.bold),
              )
            ],
          ),
        ),
      )
    );
  }
}