當(dāng)我的文本輸入框的下拉按鈕換成芯片平鋪后盆佣,想要在手機(jī)鍵盤點(diǎn)擊下一個(gè)按鈕后跳轉(zhuǎn)到下一個(gè)文本框辈毯,但是文本框下面有了組件(芯片組件warp,或button組件)后乙埃,就無(wú)法自動(dòng)跳轉(zhuǎn)闸英。
百度后得到一個(gè)方法,但不適用于我循環(huán)數(shù)據(jù)介袜,改裝成先判斷輸入框個(gè)數(shù)甫何,再通過(guò)循環(huán)向自定義的List數(shù)組里添TextEditingController()值。
官方有對(duì)應(yīng)的focus小部件遇伞,但是我放到我的view里面不執(zhí)行辙喂,沒(méi)時(shí)間去調(diào)試了,有時(shí)間研究的可以去試下鸠珠,文檔里說(shuō)直接用FocusNode進(jìn)行管理很少見(jiàn) 傳送門
image.png
1.百度到(flutter textInputAction.next焦點(diǎn)被下面的組件擋准优伞)
class _MyFormState extends State<MyForm> {
final List<TextEditingController> _controllers =
List.generate(3, (index) => TextEditingController());
final List<FocusNode> _focusNodes =
List.generate(3, (index) => FocusNode());
@override
void dispose() {
for (var controller in _controllers) {
controller.dispose();
}
for (var focusNode in _focusNodes) {
focusNode.dispose();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
children: _controllers.asMap().entries.map((entry) {
var controller = _controllers[entry.key];
var focusNode = _focusNodes[entry.key];
var isLastField = entry.key == _controllers.length - 1;
return TextField(
controller: controller,
focusNode: focusNode,
textInputAction: isLastField ? TextInputAction.done : TextInputAction.next,
onSubmitted: (value) {
if (isLastField) {
focusNode.unfocus();
} else {
FocusScope.of(context).requestFocus(_focusNodes[entry.key + 1]);
}
},
);
}).toList(),
);
}
}
2.適用于我自己
class XxxxxxView extends GetView<XxxxxxController> {
List<TextEditingController> _controllers = [];
List<FocusNode> _focusNodes = [];
bool shouldContinue = true; //控制循環(huán)變量
@override
Widget build(BuildContext context) {
return Container(
child: GetBuilder<SamplingRecordController>(builder: (ctx) {
return ListView(
children: [
_buildCyDateInput(),
_buildCyTimeInput(),
..._buildItemByConfig(context),
],
);
}),
);
}
/// 根據(jù)配置顯示填寫的信息
List<Widget> _buildItemByConfig(BuildContext context) {
List<Widget> list = [];
Map<String, dynamic> config =
ObjectUtil.isNotEmpty(controller.xx['xx'])
? controller.xx['xx']
: Map();
int i = 0;
int j = 1;
if(shouldContinue){ //頁(yè)面熱更新后會(huì)向數(shù)組重復(fù)添加一組數(shù)據(jù),添加狀態(tài)判斷
config.forEach((key, configValue) {
j++;
if(xx){
}else{
_controllers.add(TextEditingController());
_focusNodes.add(FocusNode());
}
if (j > config.length) {
// 設(shè)置標(biāo)志變量為false來(lái)跳出外層循環(huán)
shouldContinue = false;
return; // 跳出當(dāng)前內(nèi)層循環(huán)
}
});
}
config.forEach((key, configValue) {
list.add(
Column(
children: [
ListTile(
title: _buildConfigItemInput(context,configValue, i),
),
_buildConfigItemChip(context,configValue) //芯片
],
)
);
++i;
});
return list;
}
_buildConfigItemInput(BuildContext context, dynamic configValue, int i) {
var textController = _controllers[i]; //獲取對(duì)應(yīng)鍵值
var textNode = _focusNodes[i];
var isLastField = i == _controllers.length - 1; //獲取是否最后一個(gè)
return GetBuilder<SamplingRecordController>(builder: (ctx) {
return GestureDetector(
onTap: () async {
},
child: Column(
children: [
Row(
children: [
Expanded(
flex: 1,
child: TextField(
controller:
textController,
enabled: enabledStatus,
autofocus: false, //必須設(shè)置為false跳芳,不然會(huì)和focusNode焦點(diǎn)沖突,自動(dòng)關(guān)閉會(huì)上滑仍然打開(kāi)
obscureText: false,
keyboardType: configValue['inputmode'] == 'number'
? TextInputType.number
: TextInputType.text,
maxLines: null,
focusNode: textNode,
onSubmitted: (value) {
if (isLastField) {
textNode.unfocus();
// FocusManager.instance.primaryFocus?.unfocus();
} else {
FocusScope.of(context).requestFocus(_focusNodes[i + 1]);
}
},
onChanged: (String value) {
},
textInputAction: isLastField ? TextInputAction.done : TextInputAction.next, //最后一個(gè)鍵盤展示按鈕
),
),
],
),
],
)
);
});
}