TF-2475 Replace TypeAheadFormField to TypeAheadField compatible flutter_typeahead version 0.5.2

Signed-off-by: dab246 <tdvu@linagora.com>
(cherry picked from commit 87d1a17ddd76c87d2c99cee46c54ef3541929fc6)
This commit is contained in:
dab246
2024-01-30 02:50:49 +07:00
committed by Dat H. Pham
parent 83ffc1b8bd
commit cd5c240401
6 changed files with 43 additions and 42 deletions
@@ -12,8 +12,8 @@ import 'package:flutter/services.dart';
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
typedef SuggestionsCallback<T> = FutureOr<Iterable<T>> Function(String pattern); typedef SuggestionsCallback<T> = FutureOr<List<T>> Function(String pattern);
typedef FetchRecentActionCallback<R> = FutureOr<Iterable<R>> Function(String pattern); typedef FetchRecentActionCallback<R> = FutureOr<List<R>> Function(String pattern);
typedef ItemBuilder<T> = Widget Function(BuildContext context, T itemData); typedef ItemBuilder<T> = Widget Function(BuildContext context, T itemData);
typedef SuggestionSelectionCallback<T> = void Function(T suggestion); typedef SuggestionSelectionCallback<T> = void Function(T suggestion);
typedef RecentSelectionCallback<R> = void Function(R recent); typedef RecentSelectionCallback<R> = void Function(R recent);
@@ -1,4 +1,5 @@
import 'package:core/presentation/extensions/color_extension.dart'; 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:core/utils/direction_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart';
@@ -10,7 +11,7 @@ class TypeAheadFormFieldBuilder<T> extends StatefulWidget {
final SuggestionsCallback<T> suggestionsCallback; final SuggestionsCallback<T> suggestionsCallback;
final ItemBuilder<T> itemBuilder; final ItemBuilder<T> itemBuilder;
final SuggestionSelectionCallback<T> onSuggestionSelected; final SuggestionSelectionCallback<T> onSuggestionSelected;
final SuggestionsBoxDecoration suggestionsBoxDecoration; final Widget? suggestionsBoxDecoration;
final WidgetBuilder? noItemsFoundBuilder; final WidgetBuilder? noItemsFoundBuilder;
final bool hideOnEmpty; final bool hideOnEmpty;
final bool hideOnError; final bool hideOnError;
@@ -31,7 +32,7 @@ class TypeAheadFormFieldBuilder<T> extends StatefulWidget {
required this.suggestionsCallback, required this.suggestionsCallback,
required this.itemBuilder, required this.itemBuilder,
required this.onSuggestionSelected, required this.onSuggestionSelected,
this.suggestionsBoxDecoration = const SuggestionsBoxDecoration(), this.suggestionsBoxDecoration,
this.textDirection = TextDirection.ltr, this.textDirection = TextDirection.ltr,
this.debounceDuration = const Duration(milliseconds: 300), this.debounceDuration = const Duration(milliseconds: 300),
this.decoration = const InputDecoration(), this.decoration = const InputDecoration(),
@@ -68,37 +69,48 @@ class _TypeAheadFormFieldBuilderState<T> extends State<TypeAheadFormFieldBuilder
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return TypeAheadFormField<T>( return TypeAheadField<T>(
key: widget.key, key: widget.key,
textFieldConfiguration: TextFieldConfiguration( controller: widget.controller,
controller: widget.controller, focusNode: widget.focusNode,
textInputAction: widget.textInputAction, builder: (context, controller, focusNode) {
autocorrect: widget.autocorrect, return TextField(
autofillHints: widget.autofillHints, controller: controller,
keyboardType: widget.keyboardType, focusNode: focusNode,
decoration: widget.decoration, textInputAction: widget.textInputAction,
focusNode: widget.focusNode, autocorrect: widget.autocorrect,
textDirection: _textDirection, autofillHints: widget.autofillHints,
cursorColor: widget.cursorColor, keyboardType: widget.keyboardType,
onChanged: (value) { decoration: widget.decoration,
widget.onTextChange?.call(value); textDirection: _textDirection,
if (value.isNotEmpty) { cursorColor: widget.cursorColor,
final directionByText = DirectionUtils.getDirectionByEndsText(value); onChanged: (value) {
if (directionByText != _textDirection) { widget.onTextChange?.call(value);
setState(() { if (value.isNotEmpty) {
_textDirection = directionByText; final directionByText = DirectionUtils.getDirectionByEndsText(value);
}); if (directionByText != _textDirection) {
setState(() {
_textDirection = directionByText;
});
}
} }
} },
}, onSubmitted: widget.onTextSubmitted
onSubmitted: widget.onTextSubmitted );
), },
debounceDuration: widget.debounceDuration, debounceDuration: widget.debounceDuration,
suggestionsCallback: widget.suggestionsCallback, suggestionsCallback: widget.suggestionsCallback,
itemBuilder: widget.itemBuilder, itemBuilder: widget.itemBuilder,
onSuggestionSelected: widget.onSuggestionSelected, onSelected: widget.onSuggestionSelected,
suggestionsBoxDecoration: widget.suggestionsBoxDecoration, decorationBuilder: (context, child) {
noItemsFoundBuilder: widget.noItemsFoundBuilder, return widget.suggestionsBoxDecoration ?? Material(
type: MaterialType.card,
elevation: 4,
borderRadius: BorderRadius.circular(14),
child: child,
);
},
emptyBuilder: widget.noItemsFoundBuilder,
hideOnEmpty: widget.hideOnEmpty, hideOnEmpty: widget.hideOnEmpty,
hideOnError: widget.hideOnError, hideOnError: widget.hideOnError,
hideOnLoading: widget.hideOnLoading, hideOnLoading: widget.hideOnLoading,
@@ -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/presentation/views/text/type_ahead_form_field_builder.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.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:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/identity_input_decoration_builder.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); onSelectedSuggestionAction!(emailSelected);
} }
}, },
suggestionsBoxDecoration: SuggestionsBoxDecoration(
borderRadius: BorderRadius.circular(14)
),
noItemsFoundBuilder: (context) => const SizedBox(), noItemsFoundBuilder: (context) => const SizedBox(),
hideOnEmpty: true, hideOnEmpty: true,
hideOnError: true, hideOnError: true,
@@ -1,7 +1,6 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart'; import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:get/get.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/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/domain/model/recent_login_username.dart';
@@ -71,7 +70,6 @@ abstract class BaseLoginView extends GetWidget<LoginController> {
suggestionsCallback: controller.getAllRecentLoginUsernameAction, suggestionsCallback: controller.getAllRecentLoginUsernameAction,
itemBuilder: (_, loginUsername) => RecentItemTileWidget(loginUsername), itemBuilder: (_, loginUsername) => RecentItemTileWidget(loginUsername),
onSuggestionSelected: controller.selectUsernameFromSuggestion, onSuggestionSelected: controller.selectUsernameFromSuggestion,
suggestionsBoxDecoration: const SuggestionsBoxDecoration(borderRadius: BorderRadius.all(Radius.circular(14))),
noItemsFoundBuilder: (context) => const SizedBox(), noItemsFoundBuilder: (context) => const SizedBox(),
hideOnEmpty: true, hideOnEmpty: true,
hideOnError: true, hideOnError: true,
@@ -3,7 +3,6 @@ import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/theme_utils.dart'; import 'package:core/presentation/utils/theme_utils.dart';
import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart'; import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:get/get.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/base/widget/recent_item_tile_widget.dart';
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.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, suggestionsCallback: controller.getAllRecentLoginUrlAction,
itemBuilder: (_, loginUrl) => RecentItemTileWidget(loginUrl), itemBuilder: (_, loginUrl) => RecentItemTileWidget(loginUrl),
onSuggestionSelected: (loginUrl) => controller.selectBaseUrlFromSuggestion(loginUrl.url), onSuggestionSelected: (loginUrl) => controller.selectBaseUrlFromSuggestion(loginUrl.url),
suggestionsBoxDecoration: const SuggestionsBoxDecoration(borderRadius: BorderRadius.all(Radius.circular(14))),
noItemsFoundBuilder: (context) => const SizedBox(), noItemsFoundBuilder: (context) => const SizedBox(),
hideOnEmpty: true, hideOnEmpty: true,
hideOnError: true, hideOnError: true,
@@ -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:core/presentation/views/text/type_ahead_form_field_builder.dart';
import 'package:flutter/cupertino.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/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/domain/model/recent_login_username.dart';
import 'package:tmail_ui_user/features/login/presentation/widgets/login_input_decoration_builder.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, suggestionsCallback: suggestionsCallback,
itemBuilder: (_, loginUsername) => RecentItemTileWidget(loginUsername), itemBuilder: (_, loginUsername) => RecentItemTileWidget(loginUsername),
onSuggestionSelected: onSuggestionSelected, onSuggestionSelected: onSuggestionSelected,
suggestionsBoxDecoration: const SuggestionsBoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(14))
),
noItemsFoundBuilder: (context) => const SizedBox(), noItemsFoundBuilder: (context) => const SizedBox(),
hideOnEmpty: true, hideOnEmpty: true,
hideOnError: true, hideOnError: true,