【发布时间】:2021-01-27 09:01:56
【问题描述】:
我有一个 ListView,其中包含一个带有 2 个文本字段的卡片。如果在该行的第二个 TextField 上进行了输入,那么我希望焦点转到下一个 ListView 行上的第二个 TextField(基本上保持在显示的同一“列”中)。目前,如果我使用 TextInputAction.next,焦点将转到下一个 ListView 行的第一个字段。我尝试将 FocusNode 添加到 ListView,但无法将其“链接”到 ListView 中的特定项目。 FocusNode 是正确使用的方法,还是有一种简单的方法可以在执行下一个操作时跳过第一个字段。此外,如果下一行已经包含第二个 TextField 中的值,我希望焦点转到同一“列”中的下一个空 ListView。
这里是精简的sn-p代码:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(title: 'Next ListView Item'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
//this could include any number of players
List<String> players = [
'Player 1',
'Player 2',
'Player 3',
'Player 4',
'Player 5',
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: ListView.builder(
itemCount: players.length,
itemBuilder: (context, index) {
return PlayerCard(
player: players[index],
);
},
));
}
}
class PlayerCard extends StatefulWidget {
final String player;
PlayerCard({this.player});
@override
_PlayerCardState createState() => _PlayerCardState();
}
class _PlayerCardState extends State<PlayerCard> {
@override
Widget build(BuildContext context) {
return Container(
child: Card(
child: Row(children: [
Expanded(flex: 7, child: Text('${widget.player}')),
Expanded(
child: TextField(
inputFormatters: [
LengthLimitingTextInputFormatter(2),
FilteringTextInputFormatter.digitsOnly,
],
textInputAction: TextInputAction.next,
),
),
Spacer(),
Expanded(
child: TextField(
inputFormatters: [
LengthLimitingTextInputFormatter(1),
FilteringTextInputFormatter.digitsOnly,
],
onChanged: (value) {
FocusManager.instance.primaryFocus.nextFocus();
},
textInputAction: TextInputAction.next,
)),
]),
),
);
}
}
Perhaps this screen shot will give a better example of what I'm trying to accomplish
【问题讨论】: