滚动Flutter

时间:2018-06-04 03:05:33

标签: listview widget flutter

我从网上获得了一个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的状态。

enter image description here

1 个答案:

答案 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,
)