Skip to content

Commit

Permalink
add draft for fix
Browse files Browse the repository at this point in the history
  • Loading branch information
stefanschaller committed Dec 12, 2024
1 parent 4041915 commit b51f83e
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 31 deletions.
32 changes: 20 additions & 12 deletions example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -79,18 +79,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
url: "https://pub.dev"
source: hosted
version: "10.0.4"
version: "10.0.5"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
url: "https://pub.dev"
source: hosted
version: "3.0.3"
version: "3.0.5"
leak_tracker_testing:
dependency: transitive
description:
Expand Down Expand Up @@ -119,18 +119,18 @@ packages:
dependency: transitive
description:
name: material_color_utilities
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
version: "0.8.0"
version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: "https://pub.dev"
source: hosted
version: "1.12.0"
version: "1.15.0"
non_uniform_border:
dependency: transitive
description:
Expand Down Expand Up @@ -203,10 +203,18 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
url: "https://pub.dev"
source: hosted
version: "0.7.0"
version: "0.7.2"
universal_platform:
dependency: transitive
description:
name: universal_platform
sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
vector_math:
dependency: transitive
description:
Expand All @@ -219,10 +227,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
url: "https://pub.dev"
source: hosted
version: "14.2.1"
version: "14.2.5"
sdks:
dart: ">=3.3.0 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54"
49 changes: 32 additions & 17 deletions lib/src/text_field/base_text_field.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:tapped_toolkit/src/after_first_build/after_first_build_mixin.dart';
import 'package:tapped_toolkit/src/after_first_build/on_next_frame_extension.dart';
import 'package:universal_platform/universal_platform.dart';

enum TextFieldSource { inside, outside }

Expand Down Expand Up @@ -106,8 +107,7 @@ class BaseTextField extends StatefulWidget {
BaseTextFieldState createState() => BaseTextFieldState();
}

class BaseTextFieldState extends State<BaseTextField>
with AfterFirstBuildMixin {
class BaseTextFieldState extends State<BaseTextField> with AfterFirstBuildMixin {
late final _focusNode = widget.focusNode ?? FocusNode();

final _formFieldKey = GlobalKey<FormFieldState<String>>();
Expand All @@ -117,6 +117,8 @@ class BaseTextFieldState extends State<BaseTextField>
@visibleForTesting
TextEditingController get textEditingController => _textEditingController;

final _selectableRegionFocusNode = FocusNode();

@visibleForTesting
FocusNode get focusNode => _focusNode;

Expand Down Expand Up @@ -150,15 +152,21 @@ class BaseTextFieldState extends State<BaseTextField>
// FROM: https://stackoverflow.com/questions/56851701/how-to-set-cursor-position-at-the-end-of-the-value-in-flutter-in-textfield
final selection = TextSelection.collapsed(offset: text.length);

_textEditingController.value = _textEditingController.value
.copyWith(text: text, selection: selection);
_textEditingController.value = _textEditingController.value.copyWith(text: text, selection: selection);
});
} else {
_textEditingController = TextEditingController();
}

_textEditingController
.addListener(() => _onChanged(_textEditingController.text));
_textEditingController.addListener(() => _onChanged(_textEditingController.text));

if (UniversalPlatform.isWeb) {
_selectableRegionFocusNode.addListener(() {
if (_selectableRegionFocusNode.hasPrimaryFocus) {
_focusNode.requestFocus();
}
});
}

_focusNode.addListener(_addFocusNodeListener);
}
Expand All @@ -174,7 +182,7 @@ class BaseTextFieldState extends State<BaseTextField>
Widget build(BuildContext context) {
final style = widget.textStyle;

return TextFormField(
final textField = TextFormField(
key: _formFieldKey,
textAlignVertical: widget.textAlignVertical,
readOnly: widget.readOnly || widget.onTap != null,
Expand All @@ -187,29 +195,23 @@ class BaseTextFieldState extends State<BaseTextField>
cursorOpacityAnimates: widget.cursorOpacityAnimates,
expands: widget.expands,
onTap: widget.onTap,
maxLengthEnforcement:
widget.maxLength != null ? MaxLengthEnforcement.enforced : null,
maxLengthEnforcement: widget.maxLength != null ? MaxLengthEnforcement.enforced : null,
validator: (value) {
final validationValue = widget.validator?.call(value);

final isTextFieldValid = validationValue == null;
if (widget.onValidationChanged != null &&
isTextFieldValid != _textFieldIsValid) {
if (widget.onValidationChanged != null && isTextFieldValid != _textFieldIsValid) {
onNextFrame(() => widget.onValidationChanged!(isTextFieldValid));
}

_textFieldIsValid = validationValue == null;
return validationValue;
},
autovalidateMode: widget.autoValidate
? AutovalidateMode.always
: AutovalidateMode.disabled,
autovalidateMode: widget.autoValidate ? AutovalidateMode.always : AutovalidateMode.disabled,
textInputAction: widget.textInputAction,
onEditingComplete: widget.onEditingComplete,
keyboardType: widget.textInputType,
style: widget.textStyleMutator != null
? widget.textStyleMutator!(style)
: style,
style: widget.textStyleMutator != null ? widget.textStyleMutator!(style) : style,
textCapitalization: widget.textCapitalization,
obscureText: widget.obscureText,
autocorrect: widget.autocorrect,
Expand All @@ -218,6 +220,17 @@ class BaseTextFieldState extends State<BaseTextField>
controller: _textEditingController,
decoration: widget.decoration,
);

if (UniversalPlatform.isWeb) {
// ⚠️ We added the [SelectionArea], since we had an issue with the text filed in the web -> https://github.com/flutter/flutter/issues/158095
return SelectableRegion(
focusNode: _selectableRegionFocusNode,
selectionControls: emptyTextSelectionControls,
child: textField,
);
}

return textField;
}

@override
Expand Down Expand Up @@ -294,6 +307,8 @@ class BaseTextFieldState extends State<BaseTextField>
if (widget.focusNode == null) {
_focusNode.dispose();
}

_selectableRegionFocusNode.dispose();
_textEditingController.dispose();
super.dispose();
}
Expand Down
4 changes: 2 additions & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ environment:

dependencies:
non_uniform_border: ^1.0.0
# for the platform check
universal_platform: ^1.1.0
collection: ^1.16.0
flutter:
sdk: flutter
Expand All @@ -21,5 +23,3 @@ dev_dependencies:
git:
url: https://github.com/tappeddev/tapped_lints.git
ref: master

flutter:

0 comments on commit b51f83e

Please sign in to comment.