mirror of
https://github.com/foss42/apidash.git
synced 2025-06-01 14:58:28 +08:00
feat: header & env suggestions
This commit is contained in:
@ -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();
|
||||
|
@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
@ -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),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
184
pubspec.lock
184
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"
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user