setState() 在我的小部件内部不起作用,因为我的那个小部件构建在小部件树的底部,那么我该如何重建那个小部件?
setState() is not working inside my widget, since my that widget is built on the bottom of the widget tree, then how can I rebuild that widget?
我使用 Navigator.push 导航到下一个屏幕,弹出该屏幕后我无法重建旧屏幕。如果用户按下登录按钮,我还希望我的代码重建
//这是我的有状态Widget
class LoginpageClass extends StatefulWidget {
@override
_LoginpageClassState createState() => _LoginpageClassState();
}
class _LoginpageClassState extends State<LoginpageClass> {
final _auth = FirebaseAuth.instance;
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(child: buildBody(context)),
);
}
}
//上面调用这个widget
Widget buildBody(BuildContext context) => Container(
width: double.infinity,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
buildTopClippers(),
heightSpacer(20.00),
buildLogoField(),
heightSpacer(25.00),
buildTextField(
"Username",
Icons.person,
false,
onChangedEmail,
),
heightSpacer(15.00),
buildTextField("Password", Icons.lock, true, onChangedPassword),
heightSpacer(25.00),
buildSignUpText(context),
heightSpacer(25.00),
buildLoginContainer(context),
heightSpacer(20.00),
buildOtherLogins(context),
buildBottomClippers()
],
),
);
//调用上面的buildLoginContainer
Widget buildLoginContainer(BuildContext context) => Container(
width: MediaQuery.of(context).size.width,
height: 65,
child: Stack(
children: [
buildLoginBtn(context),
],
),
);
Widget buildLoginBtn(context) => Positioned(
right: -100,
child: FlatButton(
onPressed: () async {
print(email);
try {
final newUser = await _auth.signInWithEmailAndPassword(
email: Email, password: Password);
print(newUser);
if (newUser != null) {
Navigator.pushNamed(context, '/');
}
} catch (e) {
print(e);
}
},
child: Container(
width: 350,
height: 65,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(40.00),
color: Color.fromRGBO(11, 94, 255, 1),
),
child: buildLoginText(),
),
),
);
Widget buildLoginText() => Row(
children: [
widthSpacer(75.00),
Text(
"Login",
style: TextStyle(color: Colors.white, fontSize: 20.00),
),
widthSpacer(5.5),
Icon(
Icons.navigate_next,
color: Colors.white,
)
],
);
我是开发人员的初学者,因此我不知道如何在此小部件中使用 setState,而且无法通过此小部件访问它。所有小部件都在单独的 dart 文件中创建。
我查看了一些关于继承的小部件用法的文章。怎么可以用在这里??或者其他方法??
在使用 push
时,您正在存储状态,这就是为什么当您返回时,您会发现相同的状态。让我们使用 pushReplacement
,也使用 pop 端。
我使用 Navigator.push 导航到下一个屏幕,弹出该屏幕后我无法重建旧屏幕。如果用户按下登录按钮,我还希望我的代码重建
//这是我的有状态Widget
class LoginpageClass extends StatefulWidget {
@override
_LoginpageClassState createState() => _LoginpageClassState();
}
class _LoginpageClassState extends State<LoginpageClass> {
final _auth = FirebaseAuth.instance;
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(child: buildBody(context)),
);
}
}
//上面调用这个widget
Widget buildBody(BuildContext context) => Container(
width: double.infinity,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
buildTopClippers(),
heightSpacer(20.00),
buildLogoField(),
heightSpacer(25.00),
buildTextField(
"Username",
Icons.person,
false,
onChangedEmail,
),
heightSpacer(15.00),
buildTextField("Password", Icons.lock, true, onChangedPassword),
heightSpacer(25.00),
buildSignUpText(context),
heightSpacer(25.00),
buildLoginContainer(context),
heightSpacer(20.00),
buildOtherLogins(context),
buildBottomClippers()
],
),
);
//调用上面的buildLoginContainer
Widget buildLoginContainer(BuildContext context) => Container(
width: MediaQuery.of(context).size.width,
height: 65,
child: Stack(
children: [
buildLoginBtn(context),
],
),
);
Widget buildLoginBtn(context) => Positioned(
right: -100,
child: FlatButton(
onPressed: () async {
print(email);
try {
final newUser = await _auth.signInWithEmailAndPassword(
email: Email, password: Password);
print(newUser);
if (newUser != null) {
Navigator.pushNamed(context, '/');
}
} catch (e) {
print(e);
}
},
child: Container(
width: 350,
height: 65,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(40.00),
color: Color.fromRGBO(11, 94, 255, 1),
),
child: buildLoginText(),
),
),
);
Widget buildLoginText() => Row(
children: [
widthSpacer(75.00),
Text(
"Login",
style: TextStyle(color: Colors.white, fontSize: 20.00),
),
widthSpacer(5.5),
Icon(
Icons.navigate_next,
color: Colors.white,
)
],
);
我是开发人员的初学者,因此我不知道如何在此小部件中使用 setState,而且无法通过此小部件访问它。所有小部件都在单独的 dart 文件中创建。
我查看了一些关于继承的小部件用法的文章。怎么可以用在这里??或者其他方法??
在使用 push
时,您正在存储状态,这就是为什么当您返回时,您会发现相同的状态。让我们使用 pushReplacement
,也使用 pop 端。