首页 > 解决方案 > Flutter - 当 textformfield 获得焦点时,它会重置我的表单状态并导致表单重建

问题描述

我有一个带有一些自定义细分小部件和一些 FormTextFields 的表单。Segment 小部件更改了我表单中的状态,并且该部分有效。例如,第一个 Segment 设置了 _selectedBetType 的值。

问题是当其中一个 TextFormFields 获得焦点时,_selectedBetType 被设置回 0 并且表单重新构建。

这是我的表格。



    import 'package:flutter/material.dart';
    import 'package:flutter/foundation.dart';
    import 'package:pari/game.dart';
    import 'package:pari/widgets/segment_widget.dart';


    class WatchedGameForm extends StatefulWidget {
      Game _game;

      BetType _selectedBetType = BetType.Moneyline;
      int _selectedTeamIndex = 0;
      int _selectedOverUnderIndex = 0;

      WatchedGameForm(this._game);

      @override
      State createState() => _WatchedGameFormState();
    }

    class _WatchedGameFormState extends State {
      final _formKey = GlobalKey();

      _WatchedGameFormState();

      @override
      Widget build(BuildContext context) {
        print(widget._selectedBetType);
        return Form(
          key: _formKey,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              _buildBetTypeSegmentWidget(),
              _buildTeamSegmentWidget(),
              _buildOverUnderSegmentWidget(),
              _buildPointsField(),
              _buildOddsField(),
            ],
          )
        );
      }

      Widget _buildBetTypeSegmentWidget() {
        return SegmentWidget(
          selectedValue: widget._selectedBetType.index,
          items: [
            SegmentItem(BetType.Moneyline.index, describeEnum(BetType.Moneyline)),
            SegmentItem(BetType.Spread.index, describeEnum(BetType.Spread)),
            SegmentItem(BetType.TotalPoints.index, describeEnum(BetType.TotalPoints)),
          ],
          onValueChanged: (int value)  {
            setState(() {
              widget._selectedBetType = BetType.values[value];
            });
          },
        );
      }

      Widget _buildTeamSegmentWidget() {
        if (widget._selectedBetType == BetType.TotalPoints)
          return Container();

        return SegmentWidget(
          selectedValue: widget._selectedTeamIndex,
          items: [
            SegmentItem(0, widget._game.awayTeam),
            SegmentItem(1, widget._game.homeTeam),
          ],
          onValueChanged: (int value)  {
            setState(() {
              widget._selectedTeamIndex = value;
            });
          },
        );
      }

      Widget _buildOverUnderSegmentWidget() {
        if (widget._selectedBetType != BetType.TotalPoints)
          return Container();

        return SegmentWidget(
          selectedValue: widget._selectedOverUnderIndex,
          items: [
            SegmentItem(0, "Over"),
            SegmentItem(1, "Under"),
          ],
          onValueChanged: (int value)  {
            setState(() {
              widget._selectedOverUnderIndex = value;
            });
          },
        );
      }

      Widget _buildPointsField() {
        if (widget._selectedBetType == BetType.Moneyline)
          return Container();

        return Padding(
          padding: EdgeInsets.all(10.0),
          child: TextFormField(
            keyboardType: TextInputType.number,
            textAlign: TextAlign.end,
            decoration: InputDecoration(
              labelText: (widget._selectedBetType == BetType.Spread) ? 'Point Spread' : 'Total Points',
              border: OutlineInputBorder(),
            )
          ),
        );
      }

      Widget _buildOddsField() {
        return Padding(
          padding: EdgeInsets.all(10.0),
          child: TextFormField(
              keyboardType: TextInputType.number,
              textAlign: TextAlign.end,
              decoration: InputDecoration(
                labelText: 'Odds',
                border: OutlineInputBorder(),
              )
          ),
        );
      }

    }

标签: flutter

解决方案


这是因为您在州外有变量。你可以移动,

BetType _selectedBetType = BetType.Moneyline;

里面

class _WatchedGameFormState extends State 
{
 ...
}

推荐阅读