diff --git a/lib/screens/common_widgets/env_trigger_field.dart b/lib/screens/common_widgets/env_trigger_field.dart index bccaf048..d662e13d 100644 --- a/lib/screens/common_widgets/env_trigger_field.dart +++ b/lib/screens/common_widgets/env_trigger_field.dart @@ -4,69 +4,39 @@ import 'package:extended_text_field/extended_text_field.dart'; import 'env_regexp_span_builder.dart'; import 'env_trigger_options.dart'; -class EnvironmentTriggerField extends StatefulWidget { +class EnvironmentTriggerField extends StatelessWidget { const EnvironmentTriggerField({ super.key, required this.keyId, - this.initialValue, + required this.controller, + required this.focusNode, this.onChanged, this.onFieldSubmitted, this.style, this.decoration, this.optionsWidthFactor, + this.autocompleteNoTrigger, }); final String keyId; - final String? initialValue; + final TextEditingController controller; + final FocusNode focusNode; final void Function(String)? onChanged; final void Function(String)? onFieldSubmitted; final TextStyle? style; final InputDecoration? decoration; final double? optionsWidthFactor; - - @override - State createState() => - EnvironmentTriggerFieldState(); -} - -class EnvironmentTriggerFieldState extends State { - final TextEditingController controller = TextEditingController(); - final FocusNode focusNode = FocusNode(); - - @override - void initState() { - super.initState(); - controller.text = widget.initialValue ?? ''; - controller.selection = - TextSelection.collapsed(offset: controller.text.length); - } - - @override - void dispose() { - controller.dispose(); - focusNode.dispose(); - super.dispose(); - } - - @override - void didUpdateWidget(EnvironmentTriggerField oldWidget) { - super.didUpdateWidget(oldWidget); - if ((oldWidget.keyId != widget.keyId) || - (oldWidget.initialValue != widget.initialValue)) { - controller.text = widget.initialValue ?? ""; - controller.selection = - TextSelection.collapsed(offset: controller.text.length); - } - } + final AutocompleteNoTrigger? autocompleteNoTrigger; @override Widget build(BuildContext context) { return MultiTriggerAutocomplete( - key: Key(widget.keyId), + key: Key(keyId), textEditingController: controller, focusNode: focusNode, - optionsWidthFactor: widget.optionsWidthFactor, + optionsWidthFactor: optionsWidthFactor, autocompleteTriggers: [ + if (autocompleteNoTrigger != null) autocompleteNoTrigger!, AutocompleteTrigger( trigger: '{', triggerEnd: "}}", @@ -79,7 +49,7 @@ class EnvironmentTriggerFieldState extends State { autocomplete.acceptAutocompleteOption( '{${suggestion.variable.key}', ); - widget.onChanged?.call(controller.text); + onChanged?.call(controller.text); }); }), AutocompleteTrigger( @@ -94,7 +64,7 @@ class EnvironmentTriggerFieldState extends State { autocomplete.acceptAutocompleteOption( suggestion.variable.key, ); - widget.onChanged?.call(controller.text); + onChanged?.call(controller.text); }); }), ], @@ -102,10 +72,10 @@ class EnvironmentTriggerFieldState extends State { return ExtendedTextField( controller: textEditingController, focusNode: focusnode, - decoration: widget.decoration, - style: widget.style, - onChanged: widget.onChanged, - onSubmitted: widget.onFieldSubmitted, + decoration: decoration, + style: style, + onChanged: onChanged, + onSubmitted: onFieldSubmitted, specialTextSpanBuilder: EnvRegExpSpanBuilder(), onTapOutside: (event) { focusNode.unfocus(); diff --git a/lib/screens/common_widgets/envfield_cell.dart b/lib/screens/common_widgets/envfield_cell.dart index 6eedad02..ce0f2f62 100644 --- a/lib/screens/common_widgets/envfield_cell.dart +++ b/lib/screens/common_widgets/envfield_cell.dart @@ -1,8 +1,9 @@ import 'package:apidash_design_system/apidash_design_system.dart'; import 'package:flutter/material.dart'; +import 'package:multi_trigger_autocomplete/multi_trigger_autocomplete.dart'; import 'env_trigger_field.dart'; -class EnvCellField extends StatelessWidget { +class EnvCellField extends StatefulWidget { const EnvCellField({ super.key, required this.keyId, @@ -10,20 +11,69 @@ class EnvCellField extends StatelessWidget { this.hintText, this.onChanged, this.colorScheme, - }); + this.autocompleteNoTrigger, + this.focusNode, + this.controller, + }) : assert( + !(controller != null && initialValue != null), + 'controller and initialValue cannot be simultaneously defined.', + ); final String keyId; final String? initialValue; final String? hintText; final void Function(String)? onChanged; final ColorScheme? colorScheme; + final AutocompleteNoTrigger? autocompleteNoTrigger; + final FocusNode? focusNode; + final TextEditingController? controller; + + @override + State createState() => _EnvCellFieldState(); +} + +class _EnvCellFieldState extends State { + late TextEditingController _controller; + late FocusNode _focusNode; + + @override + void initState() { + super.initState(); + _controller = widget.controller ?? + TextEditingController.fromValue(TextEditingValue( + text: widget.initialValue!, + selection: + TextSelection.collapsed(offset: widget.initialValue!.length))); + _focusNode = widget.focusNode ?? FocusNode(); + } + + @override + void dispose() { + _controller.dispose(); + _focusNode.dispose(); + super.dispose(); + } + + @override + void didUpdateWidget(EnvCellField oldWidget) { + super.didUpdateWidget(oldWidget); + if ((oldWidget.keyId != widget.keyId) || + (oldWidget.initialValue != widget.initialValue)) { + _controller = widget.controller ?? + TextEditingController.fromValue(TextEditingValue( + text: widget.initialValue!, + selection: TextSelection.collapsed( + offset: widget.initialValue!.length))); + } + } @override Widget build(BuildContext context) { - var clrScheme = colorScheme ?? Theme.of(context).colorScheme; + var clrScheme = widget.colorScheme ?? Theme.of(context).colorScheme; return EnvironmentTriggerField( - keyId: keyId, - initialValue: initialValue, + keyId: widget.keyId, + controller: _controller, + focusNode: _focusNode, style: kCodeStyle.copyWith( color: clrScheme.onSurface, ), @@ -33,7 +83,7 @@ class EnvCellField extends StatelessWidget { kHintOpacity, ), ), - hintText: hintText, + hintText: widget.hintText, contentPadding: const EdgeInsets.only(bottom: 12), focusedBorder: UnderlineInputBorder( borderSide: BorderSide( @@ -48,7 +98,8 @@ class EnvCellField extends StatelessWidget { ), ), ), - onChanged: onChanged, + autocompleteNoTrigger: widget.autocompleteNoTrigger, + onChanged: widget.onChanged, ); } } diff --git a/lib/screens/common_widgets/envfield_url.dart b/lib/screens/common_widgets/envfield_url.dart index 2e7e7de5..ab5569da 100644 --- a/lib/screens/common_widgets/envfield_url.dart +++ b/lib/screens/common_widgets/envfield_url.dart @@ -3,25 +3,69 @@ import 'package:flutter/material.dart'; import 'package:apidash/consts.dart'; import 'env_trigger_field.dart'; -class EnvURLField extends StatelessWidget { +class EnvURLField extends StatefulWidget { const EnvURLField({ super.key, required this.selectedId, this.initialValue, this.onChanged, this.onFieldSubmitted, - }); + this.focusNode, + this.controller, + }) : assert( + !(controller != null && initialValue != null), + 'controller and initialValue cannot be simultaneously defined.', + ); final String selectedId; final String? initialValue; final void Function(String)? onChanged; final void Function(String)? onFieldSubmitted; + final FocusNode? focusNode; + final TextEditingController? controller; + + @override + State createState() => _EnvURLFieldState(); +} + +class _EnvURLFieldState extends State { + late TextEditingController _controller; + late FocusNode _focusNode; + + @override + void initState() { + super.initState(); + _controller = widget.controller ?? + TextEditingController.fromValue(widget.initialValue != null + ? TextEditingValue(text: widget.initialValue!) + : TextEditingValue.empty); + _focusNode = widget.focusNode ?? FocusNode(); + } + + @override + void dispose() { + _controller.dispose(); + _focusNode.dispose(); + super.dispose(); + } + + @override + void didUpdateWidget(EnvURLField oldWidget) { + super.didUpdateWidget(oldWidget); + if ((oldWidget.initialValue != widget.initialValue)) { + _controller = widget.controller ?? + TextEditingController.fromValue(widget.initialValue != null + ? TextEditingValue(text: widget.initialValue!) + : TextEditingValue.empty); + } + } @override Widget build(BuildContext context) { return EnvironmentTriggerField( - keyId: "url-$selectedId", - initialValue: initialValue, + keyId: "url-${widget.selectedId}", + controller: _controller, + focusNode: _focusNode, style: kCodeStyle, decoration: InputDecoration( hintText: kHintTextUrlCard, @@ -32,8 +76,8 @@ class EnvURLField extends StatelessWidget { ), border: InputBorder.none, ), - onChanged: onChanged, - onFieldSubmitted: onFieldSubmitted, + onChanged: widget.onChanged, + onFieldSubmitted: widget.onFieldSubmitted, optionsWidthFactor: 1, ); } diff --git a/lib/widgets/field_header.dart b/lib/widgets/field_header.dart index 90a5cd76..4c8892a9 100644 --- a/lib/widgets/field_header.dart +++ b/lib/widgets/field_header.dart @@ -1,7 +1,9 @@ import 'package:apidash_design_system/apidash_design_system.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:multi_trigger_autocomplete/multi_trigger_autocomplete.dart'; import 'package:apidash/utils/utils.dart'; +import 'package:apidash/screens/common_widgets/common_widgets.dart'; +import 'package:apidash/consts.dart'; class HeaderField extends StatefulWidget { const HeaderField({ @@ -23,97 +25,28 @@ class HeaderField extends StatefulWidget { } class _HeaderFieldState extends State { - final TextEditingController controller = TextEditingController(); - - @override - void initState() { - super.initState(); - controller.text = widget.initialValue ?? ""; - controller.selection = - TextSelection.collapsed(offset: controller.text.length); - } - - @override - void dispose() { - controller.dispose(); - super.dispose(); - } - - @override - void didUpdateWidget(HeaderField oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.initialValue != widget.initialValue) { - controller.text = widget.initialValue ?? ""; - controller.selection = - TextSelection.collapsed(offset: controller.text.length); - } - } - + final FocusNode focusNode = FocusNode(); @override Widget build(BuildContext context) { var colorScheme = widget.colorScheme ?? Theme.of(context).colorScheme; - return TypeAheadField( - key: Key(widget.keyId), - hideOnEmpty: true, - controller: controller, - onSelected: (value) { - setState(() { - controller.text = value; - }); - widget.onChanged!.call(value); - }, - itemBuilder: (context, String suggestion) { - return ListTile( - dense: true, - title: Text(suggestion), - ); - }, - suggestionsCallback: headerSuggestionCallback, - decorationBuilder: (context, child) => - suggestionBoxDecorations(context, child, colorScheme), - constraints: const BoxConstraints(maxHeight: 400), - builder: (context, controller, focusNode) => TextField( - onChanged: widget.onChanged, - controller: controller, - focusNode: focusNode, - style: kCodeStyle.copyWith( - color: colorScheme.onSurface, - ), - decoration: InputDecoration( - hintStyle: kCodeStyle.copyWith( - color: colorScheme.outline.withOpacity(kHintOpacity)), - hintText: widget.hintText, - contentPadding: const EdgeInsets.only(bottom: 12), - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: colorScheme.primary.withOpacity( - kHintOpacity, - ), - ), - ), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: colorScheme.surfaceContainerHighest, - ), - ), - ), - ), - ); - } - - Theme suggestionBoxDecorations( - BuildContext context, Widget child, ColorScheme colorScheme) { - return Theme( - data: ThemeData(colorScheme: colorScheme), - child: Material( - elevation: 4, - shape: RoundedRectangleBorder( - side: BorderSide(color: Theme.of(context).dividerColor, width: 1.2), - borderRadius: const BorderRadius.vertical(bottom: Radius.circular(8)), - ), - clipBehavior: Clip.hardEdge, - child: child, - ), + return EnvCellField( + keyId: widget.keyId, + hintText: widget.hintText, + initialValue: widget.initialValue, + focusNode: focusNode, + onChanged: widget.onChanged, + colorScheme: colorScheme, + autocompleteNoTrigger: AutocompleteNoTrigger( + optionsViewBuilder: (context, autocompleteQuery, controller) { + return HeaderSuggestions( + suggestionsCallback: headerSuggestionCallback, + query: autocompleteQuery.query, + onSuggestionTap: (suggestion) { + controller.text = suggestion; + widget.onChanged?.call(controller.text); + focusNode.unfocus(); + }); + }), ); } @@ -121,6 +54,98 @@ class _HeaderFieldState extends State { if (pattern.isEmpty) { return null; } - return getHeaderSuggestions(pattern); + return getHeaderSuggestions(pattern) + .where( + (suggestion) => suggestion.toLowerCase() != pattern.toLowerCase()) + .toList(); + } +} + +class HeaderSuggestions extends StatefulWidget { + const HeaderSuggestions({ + super.key, + required this.suggestionsCallback, + required this.query, + required this.onSuggestionTap, + }); + final Future?> Function(String) suggestionsCallback; + final String query; + final ValueSetter onSuggestionTap; + + @override + State createState() => _HeaderSuggestionsState(); +} + +class _HeaderSuggestionsState extends State { + List? suggestions; + + @override + void initState() { + super.initState(); + widget.suggestionsCallback(widget.query).then((value) { + if (mounted) { + setState(() { + suggestions = value; + }); + } + }); + } + + @override + void didUpdateWidget(HeaderSuggestions oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.query != widget.query) { + widget.suggestionsCallback(widget.query).then((value) { + if (mounted) { + setState(() { + suggestions = value; + }); + } + }); + } + } + + @override + Widget build(BuildContext context) { + if (suggestions == null) { + return const SizedBox.shrink(); + } + return suggestions!.isEmpty + ? const SizedBox.shrink() + : ClipRRect( + borderRadius: kBorderRadius8, + child: Material( + type: MaterialType.card, + elevation: 8, + child: ConstrainedBox( + constraints: + const BoxConstraints(maxHeight: kSuggestionsMenuMaxHeight), + child: Ink( + width: kSuggestionsMenuWidth, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + borderRadius: kBorderRadius8, + border: Border.all( + color: Theme.of(context).colorScheme.outlineVariant, + ), + ), + child: ListView.separated( + shrinkWrap: true, + itemCount: suggestions!.length, + separatorBuilder: (context, index) => + const Divider(height: 2), + itemBuilder: (context, index) { + final suggestion = suggestions![index]; + return ListTile( + dense: true, + title: Text(suggestion), + onTap: () => widget.onSuggestionTap(suggestion), + ); + }, + ), + ), + ), + ), + ); } } diff --git a/pubspec.lock b/pubspec.lock index 0f9f35a4..ef201514 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,23 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 + sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" url: "https://pub.dev" source: hosted - version: "72.0.0" + version: "76.0.0" _macros: dependency: transitive description: dart source: sdk - version: "0.3.2" + version: "0.3.3" analyzer: dependency: transitive description: name: analyzer - sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 + sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" url: "https://pub.dev" source: hosted - version: "6.7.0" + version: "6.11.0" ansi_styles: dependency: transitive description: @@ -240,10 +240,10 @@ packages: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.0" conventional_commit: dependency: transitive description: @@ -501,54 +501,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.20.5" - flutter_keyboard_visibility: - dependency: transitive - description: - name: flutter_keyboard_visibility - sha256: "98664be7be0e3ffca00de50f7f6a287ab62c763fc8c762e0a21584584a3ff4f8" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - flutter_keyboard_visibility_linux: - dependency: transitive - description: - name: flutter_keyboard_visibility_linux - sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - flutter_keyboard_visibility_macos: - dependency: transitive - description: - name: flutter_keyboard_visibility_macos - sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 - url: "https://pub.dev" - source: hosted - version: "1.0.0" - flutter_keyboard_visibility_platform_interface: - dependency: transitive - description: - name: flutter_keyboard_visibility_platform_interface - sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 - url: "https://pub.dev" - source: hosted - version: "2.0.0" - flutter_keyboard_visibility_web: - dependency: transitive - description: - name: flutter_keyboard_visibility_web - sha256: d3771a2e752880c79203f8d80658401d0c998e4183edca05a149f5098ce6e3d1 - url: "https://pub.dev" - source: hosted - version: "2.0.0" - flutter_keyboard_visibility_windows: - dependency: transitive - description: - name: flutter_keyboard_visibility_windows - sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 - url: "https://pub.dev" - source: hosted - version: "1.0.0" flutter_launcher_icons: dependency: "direct dev" description: @@ -610,14 +562,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_typeahead: - dependency: "direct main" - description: - name: flutter_typeahead - sha256: d64712c65db240b1057559b952398ebb6e498077baeebf9b0731dade62438a6d - url: "https://pub.dev" - source: hosted - version: "5.2.0" flutter_web_plugins: dependency: transitive description: flutter @@ -876,18 +820,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: @@ -924,10 +868,10 @@ packages: dependency: transitive description: name: macros - sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" url: "https://pub.dev" source: hosted - version: "0.1.2-main.4" + version: "0.1.3-main.0" markdown: dependency: "direct main" description: @@ -956,10 +900,10 @@ packages: dependency: "direct dev" description: name: melos - sha256: a62abfa8c7826cec927f8585572bb9adf591be152150494d879ca2c75118809d + sha256: "3f3ab3f902843d1e5a1b1a4dd39a4aca8ba1056f2d32fd8995210fa2843f646f" url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.3.2" meta: dependency: transitive description: @@ -1004,9 +948,9 @@ packages: dependency: "direct main" description: path: "." - ref: cb22bab30dd14452d184bc6ad3bb41b612b22c70 - resolved-ref: cb22bab30dd14452d184bc6ad3bb41b612b22c70 - url: "https://github.com/foss42/multi_trigger_autocomplete.git" + ref: feat-no-trigger-autocomplete + resolved-ref: "28b593c69d0cc3774ff642ab345e0960a2f7153c" + url: "https://github.com/DenserMeerkat/multi_trigger_autocomplete.git" source: git version: "1.0.1" mustache_template: @@ -1169,38 +1113,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" - pointer_interceptor: - dependency: transitive - description: - name: pointer_interceptor - sha256: "57210410680379aea8b1b7ed6ae0c3ad349bfd56fe845b8ea934a53344b9d523" - url: "https://pub.dev" - source: hosted - version: "0.10.1+2" - pointer_interceptor_ios: - dependency: transitive - description: - name: pointer_interceptor_ios - sha256: a6906772b3205b42c44614fcea28f818b1e5fdad73a4ca742a7bd49818d9c917 - url: "https://pub.dev" - source: hosted - version: "0.10.1" - pointer_interceptor_platform_interface: - dependency: transitive - description: - name: pointer_interceptor_platform_interface - sha256: "0597b0560e14354baeb23f8375cd612e8bd4841bf8306ecb71fcd0bb78552506" - url: "https://pub.dev" - source: hosted - version: "0.10.0+1" - pointer_interceptor_web: - dependency: transitive - description: - name: pointer_interceptor_web - sha256: "7a7087782110f8c1827170660b09f8aa893e0e9a61431dbbe2ac3fc482e8c044" - url: "https://pub.dev" - source: hosted - version: "0.10.2+1" pool: dependency: transitive description: @@ -1264,22 +1176,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.0" - pubspec: - dependency: transitive - description: - name: pubspec - sha256: f534a50a2b4d48dc3bc0ec147c8bd7c304280fff23b153f3f11803c4d49d927e - url: "https://pub.dev" - source: hosted - version: "2.3.0" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.5.0" qr: dependency: transitive description: @@ -1288,14 +1192,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" - quiver: - dependency: transitive - description: - name: quiver - sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 - url: "https://pub.dev" - source: hosted - version: "3.2.2" riverpod: dependency: "direct main" description: @@ -1468,7 +1364,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_gen: dependency: transitive description: @@ -1529,10 +1425,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.0" state_notifier: dependency: transitive description: @@ -1561,10 +1457,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" sync_http: dependency: transitive description: @@ -1585,26 +1481,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" + sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f" url: "https://pub.dev" source: hosted - version: "1.25.7" + version: "1.25.8" test_api: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.3" test_core: dependency: transitive description: name: test_core - sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" + sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d" url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.5" textwrap: dependency: transitive description: @@ -1645,14 +1541,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.2" - uri: - dependency: transitive - description: - name: uri - sha256: "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a" - url: "https://pub.dev" - source: hosted - version: "1.0.0" url_launcher: dependency: "direct main" description: @@ -1801,10 +1689,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.3.0" watcher: dependency: transitive description: @@ -1841,10 +1729,10 @@ packages: dependency: transitive description: name: webdriver - sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e" + sha256: "3d773670966f02a646319410766d3b5e1037efb7f07cc68f844d5e06cd4d61c8" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.4" webkit_inspection_protocol: dependency: transitive description: @@ -1911,5 +1799,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=3.5.3 <3.999.0" + dart: ">=3.6.0 <3.999.0" flutter: ">=3.24.2" diff --git a/pubspec.yaml b/pubspec.yaml index e2d00bad..3c5b01be 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -27,7 +27,6 @@ dependencies: flutter_portal: ^1.1.4 flutter_riverpod: ^2.5.1 flutter_svg: ^2.0.10+1 - flutter_typeahead: ^5.2.0 fvp: ^0.26.1 highlighter: ^0.1.1 hive_flutter: ^1.1.0 @@ -47,8 +46,8 @@ dependencies: multi_split_view: ^3.2.2 multi_trigger_autocomplete: git: - url: https://github.com/foss42/multi_trigger_autocomplete.git - ref: cb22bab30dd14452d184bc6ad3bb41b612b22c70 + url: https://github.com/DenserMeerkat/multi_trigger_autocomplete.git + ref: feat-no-trigger-autocomplete package_info_plus: ^8.0.2 path: ^1.8.3 path_provider: ^2.1.2