From cd5c2404018a4fb622351a4402bfb354bcabe7a3 Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 30 Jan 2024 02:50:49 +0700 Subject: [PATCH] TF-2475 Replace `TypeAheadFormField` to `TypeAheadField` compatible `flutter_typeahead` version `0.5.2` Signed-off-by: dab246 (cherry picked from commit 87d1a17ddd76c87d2c99cee46c54ef3541929fc6) --- .../quick_search/quick_search_input_form.dart | 4 +- .../text/type_ahead_form_field_builder.dart | 68 +++++++++++-------- ...ty_input_with_drop_list_field_builder.dart | 4 -- .../login/presentation/base_login_view.dart | 2 - .../login/presentation/login_view.dart | 2 - .../widgets/dns_lookup_input_form.dart | 5 +- 6 files changed, 43 insertions(+), 42 deletions(-) diff --git a/core/lib/presentation/views/quick_search/quick_search_input_form.dart b/core/lib/presentation/views/quick_search/quick_search_input_form.dart index 31d44e6ca..508c57b2c 100644 --- a/core/lib/presentation/views/quick_search/quick_search_input_form.dart +++ b/core/lib/presentation/views/quick_search/quick_search_input_form.dart @@ -12,8 +12,8 @@ import 'package:flutter/services.dart'; import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; -typedef SuggestionsCallback = FutureOr> Function(String pattern); -typedef FetchRecentActionCallback = FutureOr> Function(String pattern); +typedef SuggestionsCallback = FutureOr> Function(String pattern); +typedef FetchRecentActionCallback = FutureOr> Function(String pattern); typedef ItemBuilder = Widget Function(BuildContext context, T itemData); typedef SuggestionSelectionCallback = void Function(T suggestion); typedef RecentSelectionCallback = void Function(R recent); diff --git a/core/lib/presentation/views/text/type_ahead_form_field_builder.dart b/core/lib/presentation/views/text/type_ahead_form_field_builder.dart index 653d69533..a419997f7 100644 --- a/core/lib/presentation/views/text/type_ahead_form_field_builder.dart +++ b/core/lib/presentation/views/text/type_ahead_form_field_builder.dart @@ -1,4 +1,5 @@ import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/views/quick_search/quick_search_input_form.dart'; import 'package:core/utils/direction_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; @@ -10,7 +11,7 @@ class TypeAheadFormFieldBuilder extends StatefulWidget { final SuggestionsCallback suggestionsCallback; final ItemBuilder itemBuilder; final SuggestionSelectionCallback onSuggestionSelected; - final SuggestionsBoxDecoration suggestionsBoxDecoration; + final Widget? suggestionsBoxDecoration; final WidgetBuilder? noItemsFoundBuilder; final bool hideOnEmpty; final bool hideOnError; @@ -31,7 +32,7 @@ class TypeAheadFormFieldBuilder extends StatefulWidget { required this.suggestionsCallback, required this.itemBuilder, required this.onSuggestionSelected, - this.suggestionsBoxDecoration = const SuggestionsBoxDecoration(), + this.suggestionsBoxDecoration, this.textDirection = TextDirection.ltr, this.debounceDuration = const Duration(milliseconds: 300), this.decoration = const InputDecoration(), @@ -68,37 +69,48 @@ class _TypeAheadFormFieldBuilderState extends State( + return TypeAheadField( key: widget.key, - textFieldConfiguration: TextFieldConfiguration( - controller: widget.controller, - textInputAction: widget.textInputAction, - autocorrect: widget.autocorrect, - autofillHints: widget.autofillHints, - keyboardType: widget.keyboardType, - decoration: widget.decoration, - focusNode: widget.focusNode, - textDirection: _textDirection, - cursorColor: widget.cursorColor, - onChanged: (value) { - widget.onTextChange?.call(value); - if (value.isNotEmpty) { - final directionByText = DirectionUtils.getDirectionByEndsText(value); - if (directionByText != _textDirection) { - setState(() { - _textDirection = directionByText; - }); + controller: widget.controller, + focusNode: widget.focusNode, + builder: (context, controller, focusNode) { + return TextField( + controller: controller, + focusNode: focusNode, + textInputAction: widget.textInputAction, + autocorrect: widget.autocorrect, + autofillHints: widget.autofillHints, + keyboardType: widget.keyboardType, + decoration: widget.decoration, + textDirection: _textDirection, + cursorColor: widget.cursorColor, + onChanged: (value) { + widget.onTextChange?.call(value); + if (value.isNotEmpty) { + final directionByText = DirectionUtils.getDirectionByEndsText(value); + if (directionByText != _textDirection) { + setState(() { + _textDirection = directionByText; + }); + } } - } - }, - onSubmitted: widget.onTextSubmitted - ), + }, + onSubmitted: widget.onTextSubmitted + ); + }, debounceDuration: widget.debounceDuration, suggestionsCallback: widget.suggestionsCallback, itemBuilder: widget.itemBuilder, - onSuggestionSelected: widget.onSuggestionSelected, - suggestionsBoxDecoration: widget.suggestionsBoxDecoration, - noItemsFoundBuilder: widget.noItemsFoundBuilder, + onSelected: widget.onSuggestionSelected, + decorationBuilder: (context, child) { + return widget.suggestionsBoxDecoration ?? Material( + type: MaterialType.card, + elevation: 4, + borderRadius: BorderRadius.circular(14), + child: child, + ); + }, + emptyBuilder: widget.noItemsFoundBuilder, hideOnEmpty: widget.hideOnEmpty, hideOnError: widget.hideOnError, hideOnLoading: widget.hideOnLoading, diff --git a/lib/features/identity_creator/presentation/widgets/identity_input_with_drop_list_field_builder.dart b/lib/features/identity_creator/presentation/widgets/identity_input_with_drop_list_field_builder.dart index edfd81f2d..8febe3a86 100644 --- a/lib/features/identity_creator/presentation/widgets/identity_input_with_drop_list_field_builder.dart +++ b/lib/features/identity_creator/presentation/widgets/identity_input_with_drop_list_field_builder.dart @@ -3,7 +3,6 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart'; import 'package:core/utils/platform_info.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/identity_input_decoration_builder.dart'; @@ -78,9 +77,6 @@ class IdentityInputWithDropListFieldBuilder extends StatelessWidget { onSelectedSuggestionAction!(emailSelected); } }, - suggestionsBoxDecoration: SuggestionsBoxDecoration( - borderRadius: BorderRadius.circular(14) - ), noItemsFoundBuilder: (context) => const SizedBox(), hideOnEmpty: true, hideOnError: true, diff --git a/lib/features/login/presentation/base_login_view.dart b/lib/features/login/presentation/base_login_view.dart index 8b4631b8f..9c1b75591 100644 --- a/lib/features/login/presentation/base_login_view.dart +++ b/lib/features/login/presentation/base_login_view.dart @@ -1,7 +1,6 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/widget/recent_item_tile_widget.dart'; import 'package:tmail_ui_user/features/login/domain/model/recent_login_username.dart'; @@ -71,7 +70,6 @@ abstract class BaseLoginView extends GetWidget { suggestionsCallback: controller.getAllRecentLoginUsernameAction, itemBuilder: (_, loginUsername) => RecentItemTileWidget(loginUsername), onSuggestionSelected: controller.selectUsernameFromSuggestion, - suggestionsBoxDecoration: const SuggestionsBoxDecoration(borderRadius: BorderRadius.all(Radius.circular(14))), noItemsFoundBuilder: (context) => const SizedBox(), hideOnEmpty: true, hideOnError: true, diff --git a/lib/features/login/presentation/login_view.dart b/lib/features/login/presentation/login_view.dart index 75cea1029..5e028d818 100644 --- a/lib/features/login/presentation/login_view.dart +++ b/lib/features/login/presentation/login_view.dart @@ -3,7 +3,6 @@ import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/utils/theme_utils.dart'; import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/widget/recent_item_tile_widget.dart'; import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart'; @@ -141,7 +140,6 @@ class LoginView extends BaseLoginView { suggestionsCallback: controller.getAllRecentLoginUrlAction, itemBuilder: (_, loginUrl) => RecentItemTileWidget(loginUrl), onSuggestionSelected: (loginUrl) => controller.selectBaseUrlFromSuggestion(loginUrl.url), - suggestionsBoxDecoration: const SuggestionsBoxDecoration(borderRadius: BorderRadius.all(Radius.circular(14))), noItemsFoundBuilder: (context) => const SizedBox(), hideOnEmpty: true, hideOnError: true, diff --git a/lib/features/login/presentation/widgets/dns_lookup_input_form.dart b/lib/features/login/presentation/widgets/dns_lookup_input_form.dart index e825d021f..6090a26b0 100644 --- a/lib/features/login/presentation/widgets/dns_lookup_input_form.dart +++ b/lib/features/login/presentation/widgets/dns_lookup_input_form.dart @@ -1,7 +1,7 @@ +import 'package:core/presentation/views/quick_search/quick_search_input_form.dart'; import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:tmail_ui_user/features/base/widget/recent_item_tile_widget.dart'; import 'package:tmail_ui_user/features/login/domain/model/recent_login_username.dart'; import 'package:tmail_ui_user/features/login/presentation/widgets/login_input_decoration_builder.dart'; @@ -44,9 +44,6 @@ class DNSLookupInputForm extends StatelessWidget { suggestionsCallback: suggestionsCallback, itemBuilder: (_, loginUsername) => RecentItemTileWidget(loginUsername), onSuggestionSelected: onSuggestionSelected, - suggestionsBoxDecoration: const SuggestionsBoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(14)) - ), noItemsFoundBuilder: (context) => const SizedBox(), hideOnEmpty: true, hideOnError: true,