从底是我简化的法典,以代表我的问题。 但首先,请允许我就我所面临的问题作一些解释。
我们在此有网页上的>Text Field
。 在submit(
)上,我需要从每一页收集所有数据,因此每页<代码>。 自动KeepAliveClientMisy.wantKeepAlive
是压倒一切的,收益价值被设定为true
。
不幸的是,情况并非如此。 在编辑第十页的<代码>Text Field 价值之后,跃至Y页,重点从X页的<代码>Text Field上移至Y页Text Field
。 排在X位,使我从收到<条码>Text Field到<条码>。
我在哪里错了? 我只想拿到这些数值,而不必界定括号中的
class TheScreen extends StatefulWidget{
Map data;
TheScreen(this.data);
@override
TheScreenState createState() => TheScreenState();
}
class TheScreenState extends State<TheScreen>{
GlobalKey<ViewPageState> keyX = GlobalKey<ViewPageState>();
GlobalKey<ViewPageState> keyY = GlobalKey<ViewPageState>();
PageController controller = PageController();
@override
Widget build(BuildContext context) {
...
PageView pageview = PageView(controller : controller, children : [
ThePage(keyX, widget.data[ X ]),
ThePage(keyY, widget.data[ Y ])
]);
...
}
@override
initState(){
keyX.currentState?.populate();
keyY.currentState?.populate();
}
Future submit() async{
Map map = {
X : keyX.currentState?.data;
Y : keyY.currentState?.data;
};
Navigator.of(context).pop(map);
}
}
class ThePage extends StatefulWidget{
GlobalKey<ThePageState> key;
Map data;
TextEditingController tecA = TextEditingController();
TextEditingController tecB = TextEditingController();
TextEditingController tecC = TextEditingController();
ThePage(this.key, this.data);
@override
ThePageState createState() => ThePageState();
}
class ThePageState extends State<ThePage> with AutomaticKeepAliveClientMixin<ThePage>{
PageController pvc = PageController();
@override
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) {
...
TextField tfA = TextField(controller : widget.tecA, ...);
TextField tfB = TextField(controller : widget.tecB, ...);
TextField tfC = TextField(controller : widget.tecC, ...);
...
}
void populate(){
if(widget.tecA.text.isEmpty) widget.tecA.text = widget.data[ A ];
if(widget.tecB.text.isEmpty) widget.tecB.text = widget.data[ B ];
if(widget.tecC.text.isEmpty) widget.tecC.text = widget.data[ C ];
}
Map get data => {
A : widget.tecA.text,
B : widget.tecB.text,
C : widget.tecC.text
};
}