feat: header & env suggestions

This commit is contained in:
DenserMeerkat
2025-02-14 03:42:17 +05:30
parent 21c65615e9
commit 7ab1c4f293
6 changed files with 277 additions and 300 deletions

View File

@ -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<EnvironmentTriggerField> createState() =>
EnvironmentTriggerFieldState();
}
class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
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<EnvironmentTriggerField> {
autocomplete.acceptAutocompleteOption(
'{${suggestion.variable.key}',
);
widget.onChanged?.call(controller.text);
onChanged?.call(controller.text);
});
}),
AutocompleteTrigger(
@ -94,7 +64,7 @@ class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
autocomplete.acceptAutocompleteOption(
suggestion.variable.key,
);
widget.onChanged?.call(controller.text);
onChanged?.call(controller.text);
});
}),
],
@ -102,10 +72,10 @@ class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
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();

View File

@ -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<EnvCellField> createState() => _EnvCellFieldState();
}
class _EnvCellFieldState extends State<EnvCellField> {
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,
);
}
}

View File

@ -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<EnvURLField> createState() => _EnvURLFieldState();
}
class _EnvURLFieldState extends State<EnvURLField> {
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,
);
}

View File

@ -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<HeaderField> {
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<HeaderField> {
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<List<String>?> Function(String) suggestionsCallback;
final String query;
final ValueSetter<String> onSuggestionTap;
@override
State<HeaderSuggestions> createState() => _HeaderSuggestionsState();
}
class _HeaderSuggestionsState extends State<HeaderSuggestions> {
List<String>? 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),
);
},
),
),
),
),
);
}
}

View File

@ -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"

View File

@ -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