我被困在我的项目中,在该项目中,我在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'),), ), ], ), ), ); } }
根据您的用例,有很多方法可以做到这一点。以下是一些选择:
State
currentState
GlobalKey
State``State``State
InheritedWidget
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; }); }, ), ); } }