如何在flutter中访问在另一个有状态小部件中的一个有状态小部件中创建的对象

马希:

我被困在我的项目中,在该项目中,我在flutter中创建了两个有状态的小部件,作为两个不同的dart文件。现在,我必须访问在第二个窗口小部件中的第一个窗口小部件中创建的对象的实例,但是我不确定如何在创建窗口小部件时如何做到这一点。

我想到的一种可能的解决方案是在一个dart文件中声明两个小部件,而不是在两个布局中声明两个dart文件,但是我很好奇我们是否可以通过在两个单独的dart文件中声明来做到这一点。

我已经发布了文件,只是为了重新创建问题。

主镖

 import 'package:flutter/material.dart';
 import 'package:untitled2/models.dart';
 import 'package:untitled2/secondwidget.dart';

void main() {
 runApp(new MaterialApp(
     home: new MyApp(),
 ),);
}

class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
  }

      class _MyAppState extends State<MyApp> {
 final TextEditingController _nameController = new TextEditingController();
 final TextEditingController _emailIdController = new 
 TextEditingController();
 final TextEditingController _passwordController = new 
 TextEditingController();
 final TextEditingController _confirmPasswordController = new 
 TextEditingController();

 MyModel myModel = new MyModel();

 @override
 Widget build(BuildContext context) {
  return new MaterialApp(
  home: new Scaffold(
    body: new ListView(

      children: <Widget>[
        new Container(
          child: new TextFormField(
            decoration: new InputDecoration(
              labelText: 'Enter your Name'
            ),
            controller: _nameController,
            onSaved: (String value){myModel.name = value;} ,
          ),
        ),
        new Container(
          child: new TextFormField(
            decoration: new InputDecoration(
                labelText: 'EmailId'
            ),
              controller: _emailIdController,
              onSaved: (String value){myModel.emailId = value;}
          ),
        ),
        new Container(
          child: new TextFormField(
            decoration: new InputDecoration(
                labelText: 'Password'
            ),
              controller: _passwordController,
              onSaved: (String value){myModel.password = value;}
          ),
        ),
        new Container(
          child: new TextFormField(
            decoration: new InputDecoration(
                labelText: 'Confirm Password'
            ),
            controller: _confirmPasswordController,

          ),
        ),
        new Container(
          child: new FlatButton(
            onPressed: ((){

              Navigator.push(context, new MaterialPageRoute(builder: (_) => 
         new SecondScreen(),),);

            }),
            child: new Text('Save'),),
        ),



      ],


      ),
     ),
    );
   }
  }

models.dart

class MyModel {

String name;
String emailId;
String password;

  }

第二个小工具

 import 'package:flutter/material.dart';


 class SecondScreen extends StatefulWidget {
 @override
 _SecondScreenState createState() => new _SecondScreenState();
}

class _SecondScreenState extends State<SecondScreen> {
@override
Widget build(BuildContext context) {
return new MaterialApp(
  home: new Scaffold(
    body: new ListView(

      children: <Widget>[
        new Container(
          child: new TextFormField(
            decoration: new InputDecoration(
                labelText: 'Enter address'
            ),
          ),
        ),
        new Container(
          child: new TextFormField(
            decoration: new InputDecoration(
                labelText: 'Address Line 2'
            ),
          ),
        ),
        new Container(
          child: new TextFormField(
            decoration: new InputDecoration(
                labelText: 'Address Line 3'
            ),
          ),
        ),
        new Container(
          child: new TextFormField(
            decoration: new InputDecoration(
                labelText: 'POST CODE'
            ),
          ),
        ),

        new Container(
          child: new TextFormField(
            decoration: new InputDecoration(
                labelText: 'Mobile Number'
            ),
          ),
        ),
        new Container(
          child: new FlatButton(
              onPressed: ((){


                //I want to push the data captured from main.dart and from 
                            //secondwidget.dart into database
     // I want to use the instance of MyModel from main.dart here to save 
      // the data captured from the first screen and this one into database

              }),
              child: new Text('Save'),),
        ),


      ],


    ),
  ),
);
}
}
科林·杰克逊(Collin Jackson):

根据您的用例,有很多方法可以做到这一点。以下是一些选择:

  1. 您可以将创建的对象公开为的公共成员State然后使用in in currentState属性获取对另一个的引用现在,您可以通过公共成员访问创建的对象。(注意:此模式限制了您的可测试性和封装性,因此请谨慎使用。)GlobalKeyStateStateState
  2. 这两个小部件都可以具有一个扩展的祖先小部件,InheritedWidget它们用于查找创建的对象。
  3. 这两个小部件都可以在其构造函数中传递模型参数,例如ValueNotifier他们可以使用此对象读取和写入值。

如果您对用例有更详细的了解,我们可以帮助您选择一个有意义的模式。

这是一些实现选项1的代码。

import 'package:flutter/material.dart';

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

final key = new GlobalKey<MyStatefulWidget1State>();

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        body: new Column(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: <Widget>[
            new MyStatefulWidget1(key: key),
            new MyStatefulWidget2(),
          ],
        ),
      ),
    );
  }
}

class MyStatefulWidget1 extends StatefulWidget {
  MyStatefulWidget1({ Key key }) : super(key: key);
  State createState() => new MyStatefulWidget1State();
}

class MyStatefulWidget1State extends State<MyStatefulWidget1> {
  String _createdObject = "Hello world!";
  String get createdObject => _createdObject;

  @override
  Widget build(BuildContext context) {
    return new Center(
      child: new Text(_createdObject),
    );
  }
}

class MyStatefulWidget2 extends StatefulWidget {
  State createState() => new MyStatefulWidget2State();
}

class MyStatefulWidget2State extends State<MyStatefulWidget2> {
  String _text = 'PRESS ME';

  @override
  Widget build(BuildContext context) {
    return new Center(
      child: new RaisedButton(
        child: new Text(_text),
        onPressed: () {
          setState(() {
            _text = key.currentState.createdObject;
          });
        },
      ),
    );
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Flutter-如何从另一个小部件内部更改状态

一个有状态小部件中的状态方法从另一个有状态小部件中调用-Flutter

如何从另一个小部件设置状态?

如何在Flutter中将小部件放在另一个小部件上方?

如何在另一个小部件的children属性中传递小部件列表?

如何根据另一个窗口小部件中的动作更新UI或更改窗口小部件中的状态?

从另一个有状态小部件类中获取文本字段数据

如何从Flutter中的另一个文件调用小部件部分

如何从Flutter中的另一个小部件访问状态小部件动画控制器?

如何在Flutter中将一个小部件(statefull)的状态从另一个statefull小部件更改?

如何在颤抖中将一个有状态的小部件的状态从另一个状态更改为?

如何添加有状态的窗口小部件或在底部的另一个屏幕中查看

Flutter在堆栈中另一个小部件下混合/掩盖多个小部件

如何在Flutter中将事件从一个有状态的小部件广播到另一个小部件

如何使用全局密钥从Flutter中的另一个小部件更新小部件状态?

如何正确地从另一个有状态小部件调用的有状态小部件返回数据?

在Tkinter中滚动一个小部件与另一个小部件

如何从另一个类触发有状态窗口小部件中的函数(onUnityAdsFinish时)?

QT C ++-如何在另一个类中引用窗口小部件

无法从Qt中的另一个窗口小部件访问窗口小部件中的控件

如何用另一个替换Qsplitter中的一个小部件?

如何使用 Flutter 中的 onSubmitted 导航到另一个小部件

将 String 值从一个有状态小部件更改为另一个有状态小部件

如何访问在一个文件中的有状态小部件中创建的列表到另一个文件中的无状态小部件?

如何使用我在另一个有状态小部件中创建的按钮将项目添加到列表中?

如何显示在另一个 QWidget 类中创建的小部件?

如何从覆盖另一个小部件的小部件中删除透明度?

在另一个自定义小部件中创建多个自定义无状态小部件会影响性能吗?

如何将子有状态小部件的索引单选按钮值返回到 Flutter 中的另一个有状态小部件