Add a million focus nodes for good measure

This commit is contained in:
2025-02-22 15:15:09 +01:00
parent b76b51ff34
commit 771cf90349

View File

@@ -25,6 +25,13 @@ class _GameCardState extends State<GameCard>
bool _isLoading = false; bool _isLoading = false;
int _deleteClickCount = 0; int _deleteClickCount = 0;
late TextEditingController _nameController; late TextEditingController _nameController;
late TextEditingController _versionRegexController;
late TextEditingController _rssFeedUrlController;
late TextEditingController _lastPlayedController;
late FocusNode _nameFocus;
late FocusNode _versionRegexFocus;
late FocusNode _rssFeedUrlFocus;
late FocusNode _lastPlayedFocus;
@override @override
void initState() { void initState() {
@@ -34,12 +41,55 @@ class _GameCardState extends State<GameCard>
vsync: this, vsync: this,
); );
_nameController = TextEditingController(text: widget.game.name); _nameController = TextEditingController(text: widget.game.name);
_versionRegexController = TextEditingController(text: widget.game.versionRegex);
_rssFeedUrlController = TextEditingController(text: widget.game.rssFeedUrl);
_lastPlayedController = TextEditingController(text: widget.game.lastPlayed);
_nameFocus = FocusNode();
_versionRegexFocus = FocusNode();
_rssFeedUrlFocus = FocusNode();
_lastPlayedFocus = FocusNode();
_setupFocusListeners();
}
void _setupFocusListeners() {
void updateGame() {
widget.onGameUpdated(Game(
name: widget.isNameEditable ? _nameController.text : widget.game.name,
versionRegex: _versionRegexController.text,
lastPlayed: _lastPlayedController.text,
rssFeedUrl: _rssFeedUrlController.text,
actualVersion: widget.game.actualVersion,
lastUpdated: widget.game.lastUpdated,
));
}
_nameFocus.addListener(() {
if (!_nameFocus.hasFocus) updateGame();
});
_versionRegexFocus.addListener(() {
if (!_versionRegexFocus.hasFocus) updateGame();
});
_rssFeedUrlFocus.addListener(() {
if (!_rssFeedUrlFocus.hasFocus) updateGame();
});
_lastPlayedFocus.addListener(() {
if (!_lastPlayedFocus.hasFocus) updateGame();
});
} }
@override @override
void dispose() { void dispose() {
_controller.dispose(); _controller.dispose();
_nameController.dispose(); _nameController.dispose();
_versionRegexController.dispose();
_rssFeedUrlController.dispose();
_lastPlayedController.dispose();
_nameFocus.dispose();
_versionRegexFocus.dispose();
_rssFeedUrlFocus.dispose();
_lastPlayedFocus.dispose();
super.dispose(); super.dispose();
} }
@@ -89,22 +139,13 @@ class _GameCardState extends State<GameCard>
Expanded( Expanded(
child: TextField( child: TextField(
controller: _nameController, controller: _nameController,
focusNode: _nameFocus,
style: Theme.of(context).textTheme.titleLarge, style: Theme.of(context).textTheme.titleLarge,
enabled: widget.isNameEditable, enabled: widget.isNameEditable,
decoration: const InputDecoration.collapsed( decoration: const InputDecoration.collapsed(
hintText: 'New Game', hintText: 'New Game',
), ),
onChanged: onSubmitted: (_) => _nameFocus.unfocus(),
(value) => widget.onGameUpdated(
Game(
name: value,
versionRegex: widget.game.versionRegex,
lastPlayed: widget.game.lastPlayed,
rssFeedUrl: widget.game.rssFeedUrl,
actualVersion: widget.game.actualVersion,
lastUpdated: widget.game.lastUpdated,
),
),
), ),
), ),
Row( Row(
@@ -188,58 +229,22 @@ class _GameCardState extends State<GameCard>
), ),
const Divider(), const Divider(),
TextField( TextField(
controller: TextEditingController(text: widget.game.versionRegex), controller: _versionRegexController,
focusNode: _versionRegexFocus,
decoration: const InputDecoration(labelText: 'Version Regex'), decoration: const InputDecoration(labelText: 'Version Regex'),
onChanged: onSubmitted: (_) => _versionRegexFocus.unfocus(),
(value) => widget.onGameUpdated(
Game(
name:
widget.isNameEditable
? _nameController.text
: widget.game.name,
versionRegex: value,
lastPlayed: widget.game.lastPlayed,
rssFeedUrl: widget.game.rssFeedUrl,
actualVersion: widget.game.actualVersion,
lastUpdated: widget.game.lastUpdated,
),
),
), ),
TextField( TextField(
controller: TextEditingController(text: widget.game.rssFeedUrl), controller: _rssFeedUrlController,
focusNode: _rssFeedUrlFocus,
decoration: const InputDecoration(labelText: 'RSS Feed URL'), decoration: const InputDecoration(labelText: 'RSS Feed URL'),
onChanged: onSubmitted: (_) => _rssFeedUrlFocus.unfocus(),
(value) => widget.onGameUpdated(
Game(
name:
widget.isNameEditable
? _nameController.text
: widget.game.name,
versionRegex: widget.game.versionRegex,
lastPlayed: widget.game.lastPlayed,
rssFeedUrl: value,
actualVersion: widget.game.actualVersion,
lastUpdated: widget.game.lastUpdated,
),
),
), ),
TextField( TextField(
controller: TextEditingController(text: widget.game.lastPlayed), controller: _lastPlayedController,
focusNode: _lastPlayedFocus,
decoration: const InputDecoration(labelText: 'Last Played'), decoration: const InputDecoration(labelText: 'Last Played'),
onChanged: onSubmitted: (_) => _lastPlayedFocus.unfocus(),
(value) => widget.onGameUpdated(
Game(
name:
widget.isNameEditable
? _nameController.text
: widget.game.name,
versionRegex: widget.game.versionRegex,
lastPlayed: value,
rssFeedUrl: widget.game.rssFeedUrl,
actualVersion: widget.game.actualVersion,
lastUpdated: widget.game.lastUpdated,
),
),
), ),
], ],
), ),