我从网上获得了一个JSON(世界杯比赛)并用它构建了一个ListView。
Widget build(BuildContext context) {
return new Material(
child: _isLoading
? new Center(child: new CircularProgressIndicator())
: new ListView.builder(
itemCount: matches != null ? matches["jogos"].length : 0,
itemBuilder: (BuildContext context, int index) {
GameBetCard actualGameBetCard = new GameBet(
homeTeamName: matches["jogos"][index]["m_clube"],
awayTeamName: matches["jogos"][index]["v_clube"],
homeTeamId: matches["jogos"][index]["id_clubem"],
awayTeamId: matches["jogos"][index]["id_clubev"],
date: matches["jogos"][index]["data"] +
" - " +
matches["jogos"][index]["hora"],
stage: Stage.groups,
groupName: matches["jogos"][index]["nome_grupo"],
scoreHomeBet: "",
scoreAwayBet: "",
scoreHome: matches["jogos"][index]["placarm_tn"],
scoreAway: matches["jogos"][index]["placarv_tn"],
).gameBetCard;
_addGameBetToList(actualGameBetCard);
return actualGameBetCard;
},
),
);}
我在GameBetCard中有2个TextFormFields,当我在其中插入一些东西时,向下滚动并再次向上滚动,再次使用TextFormField中的数据启动该卡。其他的事情,我有一个按钮,当点击它插入firebase数据库,然后它完成我更改一个检查图标的图标,但在TextFormField的相同情况下,当它超出“屏幕范围”时重新启动
ps:我是debuggin,看到ListView只渲染将出现在屏幕上的itens。当它出来时,它被处理掉了。当它返回时,它默认再次启动。
我该如何处理?我希望它能保存我的Widget的状态。
答案 0 :(得分:0)
您的TextFormField需要具有自己的TextEditingController。
这些TextEditingController应该在顶部的Widget(包含ListView的Widget)中。如果您不这样做,则在销毁/重新创建单个小部件时,TextEditingController也将被销毁/重新创建。
在顶部创建两个TextEditingControllers并将它们传递给您的GameBet小部件,然后将它们设置为内部的TextFormFields。
此外,最上面的Widget应该是有状态的Widget,这样在重建Widget时Controller不会被破坏。最后,您还应该处置控制器。
请参见以下示例:
class MyForm extends StatefulWidget {
@override
_MyFormState createState() => _MyFormState();
}
class _MyFormState extends State<MyForm> {
TextEditingController _controller1, _controller2;
@override
void initState() {
super.initState();
_controller1 = new TextEditingController();
_controller2 = new TextEditingController();
}
@override
void dispose() {
super.dispose();
_controller1.dispose();
_controller2.dispose();
}
@override
Widget build(BuildContext context) {
return new Material(
child: ListView.builder(
itemCount: count,
itemBuilder: (BuildContext context, int index) {
return GameBet(
controller1: _controller1,
controller2: _controller2,
// rest of fields
);
},
),
);
}
}
然后,在您的GameBet内部,记住要设置控制器:
TextFormField(
controller: _controller1,
)