flutter - 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(),
)
),
);
}
}
解决方案
这是因为您在州外有变量。你可以移动,
BetType _selectedBetType = BetType.Moneyline;
里面
class _WatchedGameFormState extends State
{
...
}
推荐阅读
- html - CSS:如何在悬停时从背景图像中删除带有过渡的色调?
- python - 双动影像碰撞
- numpy - 返回具有 numpy 最大值的整行 - python
- swift - 价值观察者没有正确沟通
- php - PHP删除文件的第一行直到达到阈值
- javascript - 过滤 FullCalendar JSON 事件
- node.js - Firebase Auth NodeJS:如何通过客户端而不是服务器登录?
- google-cloud-platform - 如何配置 gcsfuse 以在 google cloud vm 中挂载存储桶并以最佳方式访问资源?
- c# - Unity C# - 当类被销毁时,无限循环线程是否终止?
- javascript - 不滚动时滚动条消失