Flutter 无法在Flatter中将变量值从一个无状态小部件传递到另一个无状态小部件
谢谢你前面的回答。我试图将“用户名、电子邮件、密码”从GetTextField无状态小部件中的TextField小部件传递到GetSignup无状态小部件中的GestureDetector小部件中的print函数。我尝试了两种方法,但在填充字段并按下按钮后,都会显示“用户名:null、用户电子邮件:null、用户密码:null”消息。可能有什么问题 方法1:Flutter 无法在Flatter中将变量值从一个无状态小部件传递到另一个无状态小部件,flutter,Flutter,谢谢你前面的回答。我试图将“用户名、电子邮件、密码”从GetTextField无状态小部件中的TextField小部件传递到GetSignup无状态小部件中的GestureDetector小部件中的print函数。我尝试了两种方法,但在填充字段并按下按钮后,都会显示“用户名:null、用户电子邮件:null、用户密码:null”消息。可能有什么问题 方法1: class SignupScreen extends StatefulWidget { static const id = "sign
class SignupScreen extends StatefulWidget {
static const id = "signup_screen";
@override
_SignupScreenState createState() => _SignupScreenState();
}
class _SignupScreenState extends State<SignupScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomPaint(
painter: BackgroundSignup(),
child: Stack(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(
horizontal: 35,
),
child: Column(
children: <Widget>[
GetHeader(),
GetTextField(),
GetSignup(),
GetButtonRow(),
],
),
),
GetBackButton(),
],
),
),
);
}
}
class GetTextField extends StatelessWidget {
String email;
String password;
String username;
@override
Widget build(BuildContext context) {
return Expanded(
flex: 4,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
username = value;
},
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "الاسم كاملا",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
email = value;
},
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "الإيميل",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
password = value;
},
obscureText: true,
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "كلمة السر",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 25,
),
],
),
);
}
}
class GetSignup extends StatelessWidget {
GetTextField getTextField = GetTextField();
@override
Widget build(BuildContext context) {
return Expanded(
flex: 1,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
GestureDetector(
onTap: () {
print('user name: ${getTextField.username}');
print('user email: {getTextField.email}');
print('user password: ${getTextField.password}');
},
child: CircleAvatar(
backgroundColor: Colors.grey.shade800,
radius: 40,
child: Icon(
Icons.arrow_back,
color: Colors.white,
),
),
),
Text(
"انشئ حسابك",
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
],
),
);
}
}
class SignupScreen extends StatefulWidget {
static const id = "signup_screen";
@override
_SignupScreenState createState() => _SignupScreenState();
}
class _SignupScreenState extends State<SignupScreen> {
GetTextField getTextField = GetTextField();
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomPaint(
painter: BackgroundSignup(),
child: Stack(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(
horizontal: 35,
),
child: Column(
children: <Widget>[
GetHeader(),
GetTextField(),
GetSignup(
username: getTextField.username,
email: getTextField.email,
password: getTextField.password,
),
GetButtonRow(),
],
),
),
GetBackButton(),
],
),
),
);
}
}
class GetTextField extends StatelessWidget {
String email;
String password;
String username;
@override
Widget build(BuildContext context) {
return Expanded(
flex: 4,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
username = value;
},
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "الاسم كاملا",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
email = value;
},
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "الإيميل",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
password = value;
},
obscureText: true,
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "كلمة السر",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 25,
),
],
),
);
}
}
class GetSignup extends StatelessWidget {
final username;
final email;
final password;
GetSignup({this.username, this.email, this.password});
@override
Widget build(BuildContext context) {
return Expanded(
flex: 1,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
GestureDetector(
onTap: () {
print('user name: $username');
print('user email: $email');
print('user password: $password');
},
child: CircleAvatar(
backgroundColor: Colors.grey.shade800,
radius: 40,
child: Icon(
Icons.arrow_back,
color: Colors.white,
),
),
),
Text(
"انشئ حسابك",
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
],
),
);
}
}
class SignupScreen扩展StatefulWidget{
静态常量id=“注册屏幕”;
@凌驾
_SignupScreenState createState()=>\u SignupScreenState();
}
类_SignupScreenState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
车身:定制喷漆(
画家:背景签名(),
子:堆栈(
儿童:[
填充物(
填充:EdgeInsets.symmetric(
横向:35,
),
子:列(
儿童:[
GetHeader(),
GetTextField(),
GetSignup(),
GetButtonRow(),
],
),
),
GetBackButton(),
],
),
),
);
}
}
类GetTextField扩展了无状态小部件{
字符串电子邮件;
字符串密码;
字符串用户名;
@凌驾
小部件构建(构建上下文){
扩大回报(
弹性:4,
子:列(
mainAxisAlignment:mainAxisAlignment.end,
儿童:[
大小盒子(
身高:15,
),
方向性(
textDirection:textDirection.rtl,
孩子:TextField(
一旦更改:(值){
用户名=值;
},
textAlign:textAlign.start,
装饰:输入装饰(
标签文字:“ااااكالا”,
标签样式:
TextStyle(颜色:Colors.white,fontwweight:fontwweight.bold),
enabledBorder:UnderlineInputBorder(
borderSide:borderSide(颜色:Colors.white),
),
),
),
),
大小盒子(
身高:15,
),
方向性(
textDirection:textDirection.rtl,
孩子:TextField(
一旦更改:(值){
电子邮件=价值;
},
textAlign:textAlign.start,
装饰:输入装饰(
标签文字:“الإيمل”,
标签样式:
TextStyle(颜色:Colors.white,fontwweight:fontwweight.bold),
enabledBorder:UnderlineInputBorder(
borderSide:borderSide(颜色:Colors.white),
),
),
),
),
大小盒子(
身高:15,
),
方向性(
textDirection:textDirection.rtl,
孩子:TextField(
一旦更改:(值){
密码=值;
},
蒙昧文字:对,
textAlign:textAlign.start,
装饰:输入装饰(
标签文字:“كلمة㶟لسس”,
标签样式:
TextStyle(颜色:Colors.white,fontwweight:fontwweight.bold),
enabledBorder:UnderlineInputBorder(
borderSide:borderSide(颜色:Colors.white),
),
),
),
),
大小盒子(
身高:25,
),
],
),
);
}
}
类GetSignup扩展了无状态小部件{
GetTextField GetTextField=GetTextField();
@凌驾
小部件构建(构建上下文){
扩大回报(
弹性:1,
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
手势检测器(
onTap:(){
打印('user name:${getTextField.username}');
打印('user email:{getTextField.email}');
打印('user password:${getTextField.password}');
},
孩子:圆环星(
背景颜色:Colors.grey.shade800,
半径:40,
子:图标(
Icons.arrow_back,
颜色:颜色,白色,
),
),
),
正文(
"انشئ حسابك",
样式:TextStyle(
尺寸:25,
fontWeight:fontWeight.bold,
),
),
],
),
);
}
}
方法2:
class SignupScreen extends StatefulWidget {
static const id = "signup_screen";
@override
_SignupScreenState createState() => _SignupScreenState();
}
class _SignupScreenState extends State<SignupScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomPaint(
painter: BackgroundSignup(),
child: Stack(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(
horizontal: 35,
),
child: Column(
children: <Widget>[
GetHeader(),
GetTextField(),
GetSignup(),
GetButtonRow(),
],
),
),
GetBackButton(),
],
),
),
);
}
}
class GetTextField extends StatelessWidget {
String email;
String password;
String username;
@override
Widget build(BuildContext context) {
return Expanded(
flex: 4,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
username = value;
},
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "الاسم كاملا",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
email = value;
},
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "الإيميل",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
password = value;
},
obscureText: true,
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "كلمة السر",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 25,
),
],
),
);
}
}
class GetSignup extends StatelessWidget {
GetTextField getTextField = GetTextField();
@override
Widget build(BuildContext context) {
return Expanded(
flex: 1,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
GestureDetector(
onTap: () {
print('user name: ${getTextField.username}');
print('user email: {getTextField.email}');
print('user password: ${getTextField.password}');
},
child: CircleAvatar(
backgroundColor: Colors.grey.shade800,
radius: 40,
child: Icon(
Icons.arrow_back,
color: Colors.white,
),
),
),
Text(
"انشئ حسابك",
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
],
),
);
}
}
class SignupScreen extends StatefulWidget {
static const id = "signup_screen";
@override
_SignupScreenState createState() => _SignupScreenState();
}
class _SignupScreenState extends State<SignupScreen> {
GetTextField getTextField = GetTextField();
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomPaint(
painter: BackgroundSignup(),
child: Stack(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(
horizontal: 35,
),
child: Column(
children: <Widget>[
GetHeader(),
GetTextField(),
GetSignup(
username: getTextField.username,
email: getTextField.email,
password: getTextField.password,
),
GetButtonRow(),
],
),
),
GetBackButton(),
],
),
),
);
}
}
class GetTextField extends StatelessWidget {
String email;
String password;
String username;
@override
Widget build(BuildContext context) {
return Expanded(
flex: 4,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
username = value;
},
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "الاسم كاملا",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
email = value;
},
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "الإيميل",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: (value) {
password = value;
},
obscureText: true,
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "كلمة السر",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 25,
),
],
),
);
}
}
class GetSignup extends StatelessWidget {
final username;
final email;
final password;
GetSignup({this.username, this.email, this.password});
@override
Widget build(BuildContext context) {
return Expanded(
flex: 1,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
GestureDetector(
onTap: () {
print('user name: $username');
print('user email: $email');
print('user password: $password');
},
child: CircleAvatar(
backgroundColor: Colors.grey.shade800,
radius: 40,
child: Icon(
Icons.arrow_back,
color: Colors.white,
),
),
),
Text(
"انشئ حسابك",
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
],
),
);
}
}
class SignupScreen扩展StatefulWidget{
静态常量id=“注册屏幕”;
@凌驾
_SignupScreenState createState()=>\u SignupScreenState();
}
类_SignupScreenState扩展状态{
GetTextField GetTextField=GetTextField();
@凌驾
小部件构建(构建上下文){
返回脚手架(
车身:定制喷漆(
画家:背景签名(),
子:堆栈(
儿童:[
填充物(
填充:EdgeInsets.symmetric(
横向:35,
),
子:列(
儿童:[
GetHeader(),
GetTextField(),
注册(
用户名:getTextField.username,
电子邮件:getTextField.email,
密码:getTextField.password,
),
GetButtonRow(),
],
),
),
GetBackButton(),
],
),
),
);
}
}
类GetTextField扩展了无状态小部件{
字符串电子邮件;
字符串密码;
字符串用户名;
@凌驾
小部件构建(构建上下文){
扩大回报(
弹性:4,
子:列(
class SignupScreen extends StatefulWidget {
static const id = "signup_screen";
@override
_SignupScreenState createState() => _SignupScreenState();
}
class _SignupScreenState extends State<SignupScreen> {
String email;
String username;
String password;
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomPaint(
painter: BackgroundSignup(),
child: Stack(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(
horizontal: 35,
),
child: Column(
children: <Widget>[
GetHeader(),
GetTextField(
onEmail: (value) {
setState(() {
value = email;
});
},
onUsername: (value) {
setState(() {
value = username;
});
},
onPassword: (value) {
setState(() {
value = password;
});
},
),
GetSignup(
username: username,
email: email,
password: password,
),
GetButtonRow(),
],
),
),
GetBackButton(),
],
),
),
);
}
}
class GetTextField extends StatelessWidget {
Function(String) onEmail;
Function(String) onPassword;
Function(String) onUsername;
GetTextField({Key key, this.onEmail, this.onPassword, this.onUsername})
: super(key: key);
@override
Widget build(BuildContext context) {
return Expanded(
flex: 4,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: onUsername,
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "الاسم كاملا",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: onEmail,
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "الإيميل",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 15,
),
Directionality(
textDirection: TextDirection.rtl,
child: TextField(
onChanged: onPassword,
obscureText: true,
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "كلمة السر",
labelStyle:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
),
),
),
SizedBox(
height: 25,
),
],
),
);
}
}
class GetSignup extends StatelessWidget {
final username;
final email;
final password;
GetSignup({Key key, this.username, this.email, this.password})
: super(key: key);
@override
Widget build(BuildContext context) {
return Expanded(
flex: 1,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
GestureDetector(
onTap: () {
//TODO: fill circle avatar
print('user name: $username');
print('user email: $email');
print('user password: $password');
},
child: CircleAvatar(
backgroundColor: Colors.grey.shade800,
radius: 40,
child: Icon(
Icons.arrow_back,
color: Colors.white,
),
),
),
Text(
"انشئ حسابك",
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
],
),
);
}
}