我對這段代碼有問題:
此登錄頁面:
class LoginPage extends StatefulWidget {
const LoginPage({Key? key}) : super(key: key);
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
@override
Widget build(BuildContext context) {
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
double h = MediaQuery.of(context).size.height;
return Scaffold(
backgroundColor: Colors.white,
body: SingleChildScrollView(
child: Column(
children: <Widget>[
const AuthHeader(
firstText: 'Login',
secText: 'Sign into your account',
flip: false,
beginC: Alignment.topRight,
endC: Alignment.bottomLeft,
caAlignment: CrossAxisAlignment.start,
),
SizedBox(height: h * 0.05),
TextFieldAuth(
controller: _emailController,
hintText: 'E-Mail',
icon: Icons.mail,
),
SizedBox(height: h * 0.03),
TextFieldAuth(
controller: _passwordController,
hintText: 'Password',
icon: Icons.password,
),
SizedBox(height: h * 0.06),
const ButtonAuth(
text: 'Sign In',
),
SizedBox(height: h * 0.07),
AuthRichText(
firstText: 'Don\'t have account? ',
secText: 'Create',
recognizer: TapGestureRecognizer()..onTap = () {
Get.toNamed('/signup');
}
),
SizedBox(height: h * 0.03),
const DividerAuth(),
SizedBox(height: h * 0.02),
const GroupAuthButton(),
],
),
),
);
}
}
這個注冊頁面:
class SignUpPage extends StatefulWidget {
const SignUpPage({Key? key}) : super(key: key);
@override
_SignUpPageState createState() => _SignUpPageState();
}
class _SignUpPageState extends State<SignUpPage> {
@override
Widget build(BuildContext context) {
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
double h = MediaQuery.of(context).size.height;
return Scaffold(
body: SingleChildScrollView(
child: Column(
children: <Widget>[
const AuthHeader(
firstText: 'SignUp',
secText: 'Create your account',
flip: true,
beginC: Alignment.bottomLeft,
endC: Alignment.topRight,
caAlignment: CrossAxisAlignment.end,
),
SizedBox(height: h * 0.05),
TextFieldAuth(
controller: _emailController,
hintText: 'E-Mail',
icon: Icons.mail,
),
SizedBox(height: h * 0.03),
TextFieldAuth(
controller: _passwordController,
hintText: 'Password',
icon: Icons.password,
),
SizedBox(height: h * 0.06),
const ButtonAuth(
text: 'Sign Up',
),
SizedBox(height: h * 0.07),
AuthRichText(
firstText: 'Have account? ',
secText: 'Sign In',
recognizer: TapGestureRecognizer()..onTap = () {
Get.back();
}
),
SizedBox(height: h * 0.03),
const DividerAuth(),
SizedBox(height: h * 0.02),
const GroupAuthButton(),
],
),
),
);
} }
這是文本欄位:
import 'package:flutter/material.dart';
class TextFieldAuth extends StatelessWidget {
const TextFieldAuth({
Key? key,
this.hintText, this.icon, this.controller,
}) : super(key: key);
final String? hintText;
final IconData? icon;
final TextEditingController? controller;
@override
Widget build(BuildContext context) {
double w = MediaQuery.of(context).size.width;
return Container(
width: w * 0.90,
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(20)),
boxShadow: [
BoxShadow(
blurRadius: 10,
spreadRadius : 2,
offset: Offset(0, 8),
color: Colors.grey
)
]
),
child: TextField(
controller: controller,
decoration: InputDecoration(
hintText: hintText,
fillColor: Colors.white,
prefixIcon: Icon(icon, color: Colors.redAccent,),
filled: true,
border: const OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.all(Radius.circular(20))
)
),
),
);
}
}
我不知道為什么這會突然發生,即使以前這段代碼運行良好。當我在 . 中輸入文本時TextField,當我關閉鍵盤或按下后退按鈕時,文本總是消失。這個問題能解決嗎?
uj5u.com熱心網友回復:
你不應該創建TextEditingControllers內部build方法。每次小部件重建時(例如,在呼叫setState()或簡單的熱多載之后),您的控制器都會重新創建,因此它們存盤的值會丟失。您應該直接在 state 中實體化您的控制器,如下所示:
class _SignUpPageState extends State<SignUpPage> {
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
@override
Widget build(BuildContext context) {
...
另外,不要忘記在不再需要控制器時處置它們。將此函式放在您的狀態類中:
@override
void dispose() {
_emailController.dispose();
_passwordController.dispose();
super.dispose();
}
有關更多資訊,請參閱:
https://api.flutter.dev/flutter/widgets/TextEditingController-class.html
https://flutter.dev/docs/cookbook/forms/text-field-changes#2-use-a-texteditingcontroller
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/352799.html
