在Flutter中两个类之间传递变量

3

我正在使用Flutter创建注册和登录页面,但遇到了一个问题:我想在另一个类SignupPage中使用在main.dart文件中_MyHomePage类中声明的相同变量'email'和'password'。

我已经导入了文件,但无法在两个类中同时使用这些值。

class _MyHomePageState extends State<MyHomePage> {
 int _counter = 0;

String _email = '';
String _password = '';

final formKey = new GlobalKey<FormState>();

FormType _formType = FormType.login;

bool validateAndSave() {
final form = formKey.currentState;
if (form.validate()) {
  form.save();
  return true;
 //      print('Form is Valid  Email: $_email, Password: $_password');
}
return false;
}
3个回答

12
您可以通过以下方式在屏幕导航时传递数据。
Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => SignUp(email: emailvariable,pass: passvariable),
                ),

您可以按照以下方式接收数据

class SignUp extends StatefulWidget {

  final email;
  final pass; 
  SignUp({Key key,this.email,this.pass}) : super(key: key);

  @override
  _SignUpState createState() => _SignUpState();
}

现在在state小部件中,您可以访问电子邮件和密码变量,如下:

widget.pass and widget.email

它会出现“找不到任何材料小部件”的错误。我做了和你一样的事情,有什么想法可能出了问题?在我的程序中,当用户按下帖子的编辑按钮时,我正在尝试获取用户单击的postID,并将其传递给另一个类。 - Tim's
1
将您的注册小部件包装在脚手架小部件中,因为它提供了材料设计,或者您也可以使用材料小部件。 - Viren V Varasadiya
我在你回答之前编辑了我的问题。抱歉,你立刻回复了 :) 你能再检查一下吗?我正在使用StreamBuilder<QuerySnapshot>从CloudFirestore中列出一些数据。我无法将其包装在scaffold中,但当我用material包装它时,它给出了相同的错误。如果您愿意,我可以发布一个问题,谢谢! - Tim's

8

有两种方法可供选择

通过类构造函数传递值

如果您不想来回跳转,可以使用这种方法

只需在第二页中像这样使用即可

class Register extends StatefulWidget {
  Register({Key key, this.email, this.pass});

  final String email;
  final String pass;

  @override
  _RegisterState createState() => _RegisterState();
}

class _RegisterState extends State<Register> {

  @override
  Widget build(BuildContext context) {
    print(widget.email);
    print(widget.pass);
    // to use state class values you need to use the widget as the parent class object
    return Container(
    );
  }
}

传递构造函数中的值

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => Register(email: email, pass: pass),
  ),

在转到另一页之前将值存储在全局范围内

如果您需要多次路由甚至需要进一步使用这些值,您可以在转到另一个页面之前将这些值存储在全局文件中并在那里访问。

创建一个文件

global.dart

library my_project.global;

// set default values for the initial run
String email = '';
String pass = '';

访问值

import 'global.dart' as global;

main() {
 // import the global.dart file to access the variables across the application
 global.email = 'xyz@email.com';
 print(global.email);
} 

第一种解决方案会导致同一个问题,即多次定义相同的变量,因此我选择第二种解决方案,但是我遇到了这个错误:错误:名称'_emailTest'通过前缀“global”被引用,但它没有在使用该前缀导入的任何库中定义。(undefined_prefixed_name at [flutter_app_service] lib/main.dart:136) - Alex Ali
1
设置全局变量不是一个好的实践。你可以通过类构造函数发送它们,或者使用一种状态管理形式(ScopedModel、Redux、BLoC等)。Flutter提供了InheritedModel(InheritedWidget),它允许你在整个应用程序中轻松共享值,而不需要太多的麻烦。 - J. S.
1
变量名不应包含下划线,因为它会使得在Dart中变成私有变量,请尝试移除下划线。@AlexAli - Yogesh Chawla

0

我猜这些小部件是独立的,但如果这是首选方式,那就试试吧! - Yogesh Chawla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接