Flutter:如何管理选项卡中的表单 [英] Flutter: how to manage forms in tabs
问题描述
我有一个包含三个选项卡的选项卡栏,每个选项卡都有不同的形式.我在底部有一个保存按钮来保存所有这些.问题是,只有当相关选项卡处于活动状态时,三个表单的全局键 currentstate 才能访问.因此,当我在选项卡 2 和 3 中时, formkey1.currentstate 为空,依此类推.请注意,我正在通过提供程序管理状态.
有关如何解决此问题的任何线索?
这是代码的简短版本:
I have a tabbar with three tabs with a different form for each one. I have a save button on the bottom to save all of them.
Problem is, the three form's globalkeys currentstate are accessible only when the relative tab is active.
So the formkey1.currentstate is null when I'm in tab 2 and 3, and so on.
Note that I'm managing state with provider.
Any clues on how to solve this?
Here is a short version of the code:
class Myclass extends StatelessWidget{
final _formKey1 = GlobalKey<FormState>();
final _formKey2 = GlobalKey<FormState>();
final _formKey3 = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return DefaultTabController(length: 3, child:
Scaffold(
appBar: AppBar(
bottom: TabBar(
tabs: [
Tab(text: "TAB ONE"),
Tab(text: "TAB TWO"),
Tab(text: "TAB THREE"),
],
),
),
bottomNavigationBar:
child: Row(
children: [
FlatButton(
onPressed: (){
_save(context);
},
child: Text("Save"),
),
],
)
),
body: TabBarView(children: [
Form(key: _formKey1, ...),
Form(key: _formKey2, ...),
Form(key: _formKey3, ...),
])
),);
}
void _save(BuildContext context) async {
print(_formKey1.currentState); // NULL ON TAB 2 AND 3
print(_formKey2.currentState); // NULL ON TAB 1 AND 3
print(_formKey3.currentState); // NULL ON TAB 1 AND 2
//my save procedure
}}
推荐答案
如果你想保持它们的状态,你应该为每个 TabView 页面使用 AutomaticKeepAliveClientMixin
.您也可以使用 KeepAliveWrapper
来包装每个页面.代码如下:
You should use AutomaticKeepAliveClientMixin
for each TabView page if you want to keep their states. Also you can you use a KeepAliveWrapper
to wrap each page.
Here is the code:
class KeepAliveWrapper extends StatefulWidget {
final Widget child;
const KeepAliveWrapper({Key key, this.child}) : super(key: key);
@override
__KeepAliveWrapperState createState() => __KeepAliveWrapperState();
}
class __KeepAliveWrapperState extends State<KeepAliveWrapper>
with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
super.build(context);
return widget.child;
}
@override
bool get wantKeepAlive => true;
}
像这样使用它:
KeepAliveWrapper(
child: Form(
key: _formKey1,
child: Container(),
),
)
请注意,在访问每个选项卡之前,您的子页面仍未构建.
Note that before visiting each tab, your sub pages are still not built.
这篇关于Flutter:如何管理选项卡中的表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!