refact: Remote ID editor, only select text on focus (#10854)

Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
fufesou 2025-02-20 19:35:04 +08:00 committed by GitHub
parent 8b9a7a3506
commit f631c1c28d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 27 additions and 29 deletions

View file

@ -8,13 +8,16 @@ import 'package:flutter_hbb/common/widgets/peer_card.dart';
class AllPeersLoader {
List<Peer> peers = [];
bool isPeersLoading = false;
bool isPeersLoaded = false;
bool _isPeersLoading = false;
bool _isPeersLoaded = false;
final String _listenerKey = 'AllPeersLoader';
late void Function(VoidCallback) setState;
bool get needLoad => !_isPeersLoaded && !_isPeersLoading;
bool get isPeersLoaded => _isPeersLoaded;
AllPeersLoader();
void init(void Function(VoidCallback) setState) {
@ -33,10 +36,10 @@ class AllPeersLoader {
}
Future<void> getAllPeers() async {
if (isPeersLoaded || isPeersLoading) {
if (!needLoad) {
return;
}
isPeersLoading = true;
_isPeersLoading = true;
if (gFFI.recentPeersModel.peers.isEmpty) {
bind.mainLoadRecentPeers();
@ -96,8 +99,8 @@ class AllPeersLoader {
peers = parsedPeers;
setState(() {
isPeersLoading = false;
isPeersLoaded = true;
_isPeersLoading = false;
_isPeersLoaded = true;
});
}
}

View file

@ -282,8 +282,15 @@ class _ConnectionPageState extends State<ConnectionPage>
void onFocusChanged() {
_idInputFocused.value = _idFocusNode.hasFocus;
if (_idFocusNode.hasFocus && !_allPeersLoader.isPeersLoading) {
_allPeersLoader.getAllPeers();
if (_idFocusNode.hasFocus) {
if (_allPeersLoader.needLoad) {
_allPeersLoader.getAllPeers();
}
final textLength = _idEditingController.value.text.length;
// Select all to facilitate removing text, just following the behavior of address input of chrome.
_idEditingController.selection =
TextSelection(baseOffset: 0, extentOffset: textLength);
}
}
@ -390,17 +397,6 @@ class _ConnectionPageState extends State<ConnectionPage>
) {
fieldTextEditingController.text = _idController.text;
Get.put<TextEditingController>(fieldTextEditingController);
// The listener will be added multiple times when the widget is rebuilt.
// We may need to use the `RawAutocomplete` to get the focus node.
// Temporarily remove Selection because Selection can cause users to accidentally delete previously entered content during input.
// final textLength =
// fieldTextEditingController.value.text.length;
// // Select all to facilitate removing text, just following the behavior of address input of chrome.
// fieldTextEditingController.selection =
// TextSelection(baseOffset: 0, extentOffset: textLength);
return Obx(() => TextField(
autocorrect: false,
enableSuggestions: false,

View file

@ -104,8 +104,15 @@ class _ConnectionPageState extends State<ConnectionPage> {
void onFocusChanged() {
_idEmpty.value = _idEditingController.text.isEmpty;
if (_idFocusNode.hasFocus && !_allPeersLoader.isPeersLoading) {
_allPeersLoader.getAllPeers();
if (_idFocusNode.hasFocus) {
if (_allPeersLoader.needLoad) {
_allPeersLoader.getAllPeers();
}
final textLength = _idEditingController.value.text.length;
// Select all to facilitate removing text, just following the behavior of address input of chrome.
_idEditingController.selection =
TextSelection(baseOffset: 0, extentOffset: textLength);
}
}
@ -210,14 +217,6 @@ class _ConnectionPageState extends State<ConnectionPage> {
fieldTextEditingController.text = _idController.text;
Get.put<TextEditingController>(
fieldTextEditingController);
// Temporarily remove Selection because Selection can cause users to accidentally delete previously entered content during input.
// final textLength =
// fieldTextEditingController.value.text.length;
// // select all to facilitate removing text, just following the behavior of address input of chrome
// fieldTextEditingController.selection = TextSelection(
// baseOffset: 0, extentOffset: textLength);
return AutoSizeTextField(
controller: fieldTextEditingController,
focusNode: fieldFocusNode,