mirror of
https://github.com/foss42/apidash.git
synced 2025-06-28 03:19:40 +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_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();
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -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),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
184
pubspec.lock
184
pubspec.lock
@ -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"
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user