问题描述
你好我想知道如何从其他小部件访问变量。例如:我希望当我触摸小部件 BotonLogin 的按钮时,它会打印小部件 CamposUsuario 的用户变量。
class CamposUsuario extends StatelessWidget {
final String texto;
CamposUsuario({required this.texto});
final usuario = TextEditingController();
@override
Widget build(BuildContext context) {
return TextFormField(
decoration: Inputdecoration(
labelStyle: TextStyle(fontSize: 20),labelText: "$texto"),obscureText: (this.texto == "Password") ? true : false,controller: usuario,);
}
}
class BotonLogin extends StatelessWidget {
const BotonLogin({
Key? key,}) : super(key: key);
@override
Widget build(BuildContext context) {
return RaisedButton(
padding: EdgeInsets.symmetric(horizontal: 60),elevation: 7,onpressed: () {
print('si');
},color: Colors.Amber[900],shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),child: Text("Login"),);
}
}
解决方法
如果你想解决你的问题,那么你需要状态管理。
查看 office 文档以获取状态管理方法列表
https://flutter.dev/docs/development/data-and-backend/state-mgmt/options
,您可以将 onPressed
回调传递给您的 BotonLogin
,并将 controller
传递给您的 CamposUsuario
。然后父小部件将使用传递的 TextEditingController
来获取 CamposeUsuario
的值。
示例...
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final TextEditingController usernameController = TextEditingController();
// UPDATE
final TextEditingController passwordController = TextEditingController();
return Scaffold(
body: Column(
children: <Widget>[
CamposUsuario(
texto: 'Username',usuario: usernameController,),// UPDATE
CamposUsuario(
texto: 'Password',usuario: passwordController,BotonLogin(
onPressed: () {
print('Si ${usernameController.text}');
// UPDATE
print('Password: ${passwordController.text}');
},],);
}
}
class CamposUsuario extends StatelessWidget {
CamposUsuario({
required this.texto,required this.usuario,Key? key,}) : super(key: key);
final String texto;
final TextEditingController usuario;
@override
Widget build(BuildContext context) {
return TextFormField(
decoration: InputDecoration(
labelStyle: const TextStyle(fontSize: 20),labelText: texto,obscureText: (this.texto == "Password") ? true : false,controller: usuario,);
}
}
class BotonLogin extends StatelessWidget {
BotonLogin({
required this.onPressed,}) : super(key: key);
final VoidCallback onPressed;
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: onPressed,child: Text("Login"),);
}
}