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_regexp_span_builder.dart';
import 'env_trigger_options.dart'; import 'env_trigger_options.dart';
class EnvironmentTriggerField extends StatefulWidget { class EnvironmentTriggerField extends StatelessWidget {
const EnvironmentTriggerField({ const EnvironmentTriggerField({
super.key, super.key,
required this.keyId, required this.keyId,
this.initialValue, required this.controller,
required this.focusNode,
this.onChanged, this.onChanged,
this.onFieldSubmitted, this.onFieldSubmitted,
this.style, this.style,
this.decoration, this.decoration,
this.optionsWidthFactor, this.optionsWidthFactor,
this.autocompleteNoTrigger,
}); });
final String keyId; final String keyId;
final String? initialValue; final TextEditingController controller;
final FocusNode focusNode;
final void Function(String)? onChanged; final void Function(String)? onChanged;
final void Function(String)? onFieldSubmitted; final void Function(String)? onFieldSubmitted;
final TextStyle? style; final TextStyle? style;
final InputDecoration? decoration; final InputDecoration? decoration;
final double? optionsWidthFactor; final double? optionsWidthFactor;
final AutocompleteNoTrigger? autocompleteNoTrigger;
@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);
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MultiTriggerAutocomplete( return MultiTriggerAutocomplete(
key: Key(widget.keyId), key: Key(keyId),
textEditingController: controller, textEditingController: controller,
focusNode: focusNode, focusNode: focusNode,
optionsWidthFactor: widget.optionsWidthFactor, optionsWidthFactor: optionsWidthFactor,
autocompleteTriggers: [ autocompleteTriggers: [
if (autocompleteNoTrigger != null) autocompleteNoTrigger!,
AutocompleteTrigger( AutocompleteTrigger(
trigger: '{', trigger: '{',
triggerEnd: "}}", triggerEnd: "}}",
@ -79,7 +49,7 @@ class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
autocomplete.acceptAutocompleteOption( autocomplete.acceptAutocompleteOption(
'{${suggestion.variable.key}', '{${suggestion.variable.key}',
); );
widget.onChanged?.call(controller.text); onChanged?.call(controller.text);
}); });
}), }),
AutocompleteTrigger( AutocompleteTrigger(
@ -94,7 +64,7 @@ class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
autocomplete.acceptAutocompleteOption( autocomplete.acceptAutocompleteOption(
suggestion.variable.key, suggestion.variable.key,
); );
widget.onChanged?.call(controller.text); onChanged?.call(controller.text);
}); });
}), }),
], ],
@ -102,10 +72,10 @@ class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
return ExtendedTextField( return ExtendedTextField(
controller: textEditingController, controller: textEditingController,
focusNode: focusnode, focusNode: focusnode,
decoration: widget.decoration, decoration: decoration,
style: widget.style, style: style,
onChanged: widget.onChanged, onChanged: onChanged,
onSubmitted: widget.onFieldSubmitted, onSubmitted: onFieldSubmitted,
specialTextSpanBuilder: EnvRegExpSpanBuilder(), specialTextSpanBuilder: EnvRegExpSpanBuilder(),
onTapOutside: (event) { onTapOutside: (event) {
focusNode.unfocus(); focusNode.unfocus();

View File

@ -1,8 +1,9 @@
import 'package:apidash_design_system/apidash_design_system.dart'; import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:multi_trigger_autocomplete/multi_trigger_autocomplete.dart';
import 'env_trigger_field.dart'; import 'env_trigger_field.dart';
class EnvCellField extends StatelessWidget { class EnvCellField extends StatefulWidget {
const EnvCellField({ const EnvCellField({
super.key, super.key,
required this.keyId, required this.keyId,
@ -10,20 +11,69 @@ class EnvCellField extends StatelessWidget {
this.hintText, this.hintText,
this.onChanged, this.onChanged,
this.colorScheme, 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 keyId;
final String? initialValue; final String? initialValue;
final String? hintText; final String? hintText;
final void Function(String)? onChanged; final void Function(String)? onChanged;
final ColorScheme? colorScheme; 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var clrScheme = colorScheme ?? Theme.of(context).colorScheme; var clrScheme = widget.colorScheme ?? Theme.of(context).colorScheme;
return EnvironmentTriggerField( return EnvironmentTriggerField(
keyId: keyId, keyId: widget.keyId,
initialValue: initialValue, controller: _controller,
focusNode: _focusNode,
style: kCodeStyle.copyWith( style: kCodeStyle.copyWith(
color: clrScheme.onSurface, color: clrScheme.onSurface,
), ),
@ -33,7 +83,7 @@ class EnvCellField extends StatelessWidget {
kHintOpacity, kHintOpacity,
), ),
), ),
hintText: hintText, hintText: widget.hintText,
contentPadding: const EdgeInsets.only(bottom: 12), contentPadding: const EdgeInsets.only(bottom: 12),
focusedBorder: UnderlineInputBorder( focusedBorder: UnderlineInputBorder(
borderSide: BorderSide( 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 'package:apidash/consts.dart';
import 'env_trigger_field.dart'; import 'env_trigger_field.dart';
class EnvURLField extends StatelessWidget { class EnvURLField extends StatefulWidget {
const EnvURLField({ const EnvURLField({
super.key, super.key,
required this.selectedId, required this.selectedId,
this.initialValue, this.initialValue,
this.onChanged, this.onChanged,
this.onFieldSubmitted, this.onFieldSubmitted,
}); this.focusNode,
this.controller,
}) : assert(
!(controller != null && initialValue != null),
'controller and initialValue cannot be simultaneously defined.',
);
final String selectedId; final String selectedId;
final String? initialValue; final String? initialValue;
final void Function(String)? onChanged; final void Function(String)? onChanged;
final void Function(String)? onFieldSubmitted; 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return EnvironmentTriggerField( return EnvironmentTriggerField(
keyId: "url-$selectedId", keyId: "url-${widget.selectedId}",
initialValue: initialValue, controller: _controller,
focusNode: _focusNode,
style: kCodeStyle, style: kCodeStyle,
decoration: InputDecoration( decoration: InputDecoration(
hintText: kHintTextUrlCard, hintText: kHintTextUrlCard,
@ -32,8 +76,8 @@ class EnvURLField extends StatelessWidget {
), ),
border: InputBorder.none, border: InputBorder.none,
), ),
onChanged: onChanged, onChanged: widget.onChanged,
onFieldSubmitted: onFieldSubmitted, onFieldSubmitted: widget.onFieldSubmitted,
optionsWidthFactor: 1, optionsWidthFactor: 1,
); );
} }

View File

@ -1,7 +1,9 @@
import 'package:apidash_design_system/apidash_design_system.dart'; import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.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/utils/utils.dart';
import 'package:apidash/screens/common_widgets/common_widgets.dart';
import 'package:apidash/consts.dart';
class HeaderField extends StatefulWidget { class HeaderField extends StatefulWidget {
const HeaderField({ const HeaderField({
@ -23,97 +25,28 @@ class HeaderField extends StatefulWidget {
} }
class _HeaderFieldState extends State<HeaderField> { class _HeaderFieldState extends State<HeaderField> {
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();
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);
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var colorScheme = widget.colorScheme ?? Theme.of(context).colorScheme; var colorScheme = widget.colorScheme ?? Theme.of(context).colorScheme;
return TypeAheadField( return EnvCellField(
key: Key(widget.keyId), keyId: 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, hintText: widget.hintText,
contentPadding: const EdgeInsets.only(bottom: 12), initialValue: widget.initialValue,
focusedBorder: UnderlineInputBorder( focusNode: focusNode,
borderSide: BorderSide( onChanged: widget.onChanged,
color: colorScheme.primary.withOpacity( colorScheme: colorScheme,
kHintOpacity, autocompleteNoTrigger: AutocompleteNoTrigger(
), optionsViewBuilder: (context, autocompleteQuery, controller) {
), return HeaderSuggestions(
), suggestionsCallback: headerSuggestionCallback,
enabledBorder: UnderlineInputBorder( query: autocompleteQuery.query,
borderSide: BorderSide( onSuggestionTap: (suggestion) {
color: colorScheme.surfaceContainerHighest, controller.text = suggestion;
), widget.onChanged?.call(controller.text);
), focusNode.unfocus();
), });
), }),
);
}
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,
),
); );
} }
@ -121,6 +54,98 @@ class _HeaderFieldState extends State<HeaderField> {
if (pattern.isEmpty) { if (pattern.isEmpty) {
return null; 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 dependency: transitive
description: description:
name: _fe_analyzer_shared name: _fe_analyzer_shared
sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "72.0.0" version: "76.0.0"
_macros: _macros:
dependency: transitive dependency: transitive
description: dart description: dart
source: sdk source: sdk
version: "0.3.2" version: "0.3.3"
analyzer: analyzer:
dependency: transitive dependency: transitive
description: description:
name: analyzer name: analyzer
sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.7.0" version: "6.11.0"
ansi_styles: ansi_styles:
dependency: transitive dependency: transitive
description: description:
@ -240,10 +240,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.18.0" version: "1.19.0"
conventional_commit: conventional_commit:
dependency: transitive dependency: transitive
description: description:
@ -501,54 +501,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.20.5" 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: flutter_launcher_icons:
dependency: "direct dev" dependency: "direct dev"
description: description:
@ -610,14 +562,6 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" 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: flutter_web_plugins:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -876,18 +820,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "10.0.5" version: "10.0.7"
leak_tracker_flutter_testing: leak_tracker_flutter_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_flutter_testing name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.5" version: "3.0.8"
leak_tracker_testing: leak_tracker_testing:
dependency: transitive dependency: transitive
description: description:
@ -924,10 +868,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: macros name: macros
sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.1.2-main.4" version: "0.1.3-main.0"
markdown: markdown:
dependency: "direct main" dependency: "direct main"
description: description:
@ -956,10 +900,10 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: melos name: melos
sha256: a62abfa8c7826cec927f8585572bb9adf591be152150494d879ca2c75118809d sha256: "3f3ab3f902843d1e5a1b1a4dd39a4aca8ba1056f2d32fd8995210fa2843f646f"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.2.0" version: "6.3.2"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@ -1004,9 +948,9 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: cb22bab30dd14452d184bc6ad3bb41b612b22c70 ref: feat-no-trigger-autocomplete
resolved-ref: cb22bab30dd14452d184bc6ad3bb41b612b22c70 resolved-ref: "28b593c69d0cc3774ff642ab345e0960a2f7153c"
url: "https://github.com/foss42/multi_trigger_autocomplete.git" url: "https://github.com/DenserMeerkat/multi_trigger_autocomplete.git"
source: git source: git
version: "1.0.1" version: "1.0.1"
mustache_template: mustache_template:
@ -1169,38 +1113,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.8" 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: pool:
dependency: transitive dependency: transitive
description: description:
@ -1264,22 +1176,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.0" version: "0.4.0"
pubspec:
dependency: transitive
description:
name: pubspec
sha256: f534a50a2b4d48dc3bc0ec147c8bd7c304280fff23b153f3f11803c4d49d927e
url: "https://pub.dev"
source: hosted
version: "2.3.0"
pubspec_parse: pubspec_parse:
dependency: transitive dependency: transitive
description: description:
name: pubspec_parse name: pubspec_parse
sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.0" version: "1.5.0"
qr: qr:
dependency: transitive dependency: transitive
description: description:
@ -1288,14 +1192,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.2" version: "3.0.2"
quiver:
dependency: transitive
description:
name: quiver
sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2
url: "https://pub.dev"
source: hosted
version: "3.2.2"
riverpod: riverpod:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1468,7 +1364,7 @@ packages:
dependency: transitive dependency: transitive
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.99" version: "0.0.0"
source_gen: source_gen:
dependency: transitive dependency: transitive
description: description:
@ -1529,10 +1425,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.11.1" version: "1.12.0"
state_notifier: state_notifier:
dependency: transitive dependency: transitive
description: description:
@ -1561,10 +1457,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: string_scanner name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.0" version: "1.3.0"
sync_http: sync_http:
dependency: transitive dependency: transitive
description: description:
@ -1585,26 +1481,26 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: test name: test
sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.25.7" version: "1.25.8"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.2" version: "0.7.3"
test_core: test_core:
dependency: transitive dependency: transitive
description: description:
name: test_core name: test_core
sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.4" version: "0.6.5"
textwrap: textwrap:
dependency: transitive dependency: transitive
description: description:
@ -1645,14 +1541,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.2" version: "2.2.2"
uri:
dependency: transitive
description:
name: uri
sha256: "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
url_launcher: url_launcher:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1801,10 +1689,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.5" version: "14.3.0"
watcher: watcher:
dependency: transitive dependency: transitive
description: description:
@ -1841,10 +1729,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: webdriver name: webdriver
sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e" sha256: "3d773670966f02a646319410766d3b5e1037efb7f07cc68f844d5e06cd4d61c8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.3" version: "3.0.4"
webkit_inspection_protocol: webkit_inspection_protocol:
dependency: transitive dependency: transitive
description: description:
@ -1911,5 +1799,5 @@ packages:
source: hosted source: hosted
version: "2.2.1" version: "2.2.1"
sdks: sdks:
dart: ">=3.5.3 <3.999.0" dart: ">=3.6.0 <3.999.0"
flutter: ">=3.24.2" flutter: ">=3.24.2"

View File

@ -27,7 +27,6 @@ dependencies:
flutter_portal: ^1.1.4 flutter_portal: ^1.1.4
flutter_riverpod: ^2.5.1 flutter_riverpod: ^2.5.1
flutter_svg: ^2.0.10+1 flutter_svg: ^2.0.10+1
flutter_typeahead: ^5.2.0
fvp: ^0.26.1 fvp: ^0.26.1
highlighter: ^0.1.1 highlighter: ^0.1.1
hive_flutter: ^1.1.0 hive_flutter: ^1.1.0
@ -47,8 +46,8 @@ dependencies:
multi_split_view: ^3.2.2 multi_split_view: ^3.2.2
multi_trigger_autocomplete: multi_trigger_autocomplete:
git: git:
url: https://github.com/foss42/multi_trigger_autocomplete.git url: https://github.com/DenserMeerkat/multi_trigger_autocomplete.git
ref: cb22bab30dd14452d184bc6ad3bb41b612b22c70 ref: feat-no-trigger-autocomplete
package_info_plus: ^8.0.2 package_info_plus: ^8.0.2
path: ^1.8.3 path: ^1.8.3
path_provider: ^2.1.2 path_provider: ^2.1.2