add multi_trigger_autocomplete_plus

This commit is contained in:
DenserMeerkat
2025-02-15 20:54:01 +05:30
parent 21c65615e9
commit 2eedd1b41a
35 changed files with 3106 additions and 69 deletions

View File

@ -0,0 +1,47 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/
# Web related
lib/generated_plugin_registrant.dart
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release

View File

@ -0,0 +1,16 @@
# example
A new Flutter project.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.

View File

@ -0,0 +1,29 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

View File

@ -0,0 +1,133 @@
import 'package:example/src/chat_message_list.dart';
import 'package:example/src/chat_message_text_field.dart';
import 'package:example/src/data.dart';
import 'package:example/src/options/options.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:multi_trigger_autocomplete_plus/multi_trigger_autocomplete.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return Portal(
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
platform: TargetPlatform.iOS,
textTheme: GoogleFonts.robotoMonoTextTheme(
Theme.of(context).textTheme,
),
),
home: const MyHomePage(),
),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final messages = [...sampleGroupConversation];
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
toolbarHeight: 60,
backgroundColor: const Color(0xFF5B61B9),
title: const Text(
'Multi Trigger Autocomplete',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
centerTitle: true,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(24),
bottomRight: Radius.circular(24),
),
),
),
body: Column(
children: [
Expanded(child: ChatMessageList(messages: messages)),
MultiTriggerAutocomplete(
optionsAlignment: OptionsAlignment.topStart,
autocompleteTriggers: [
AutocompleteTrigger(
trigger: '@',
optionsViewBuilder: (context, autocompleteQuery, controller) {
return MentionAutocompleteOptions(
query: autocompleteQuery.query,
onMentionUserTap: (user) {
final autocomplete = MultiTriggerAutocomplete.of(context);
return autocomplete.acceptAutocompleteOption(user.id);
},
);
},
),
AutocompleteTrigger(
trigger: '#',
optionsViewBuilder: (context, autocompleteQuery, controller) {
return HashtagAutocompleteOptions(
query: autocompleteQuery.query,
onHashtagTap: (hashtag) {
final autocomplete = MultiTriggerAutocomplete.of(context);
return autocomplete
.acceptAutocompleteOption(hashtag.name);
},
);
},
),
AutocompleteTrigger(
trigger: ':',
optionsViewBuilder: (context, autocompleteQuery, controller) {
return EmojiAutocompleteOptions(
query: autocompleteQuery.query,
onEmojiTap: (emoji) {
final autocomplete = MultiTriggerAutocomplete.of(context);
return autocomplete.acceptAutocompleteOption(
emoji.char,
// Passing false as we don't want the trigger [:] to
// get prefixed to the option in case of emoji.
keepTrigger: false,
);
},
);
},
),
],
fieldViewBuilder: (context, controller, focusNode) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: ChatMessageTextField(
focusNode: focusNode,
controller: controller,
onSend: (message) {
controller.clear();
setState(() {
messages.add(message);
});
},
),
);
},
),
],
),
);
}
}

View File

@ -0,0 +1,67 @@
import 'package:example/src/models.dart';
import 'package:flutter/material.dart';
import 'package:flutter_parsed_text/flutter_parsed_text.dart';
import 'package:google_fonts/google_fonts.dart';
class ChatMessageList extends StatelessWidget {
const ChatMessageList({
Key? key,
required this.messages,
}) : super(key: key);
final List<ChatMessage> messages;
@override
Widget build(BuildContext context) {
final messages = this.messages.reversed.toList();
return ListView.separated(
reverse: true,
itemCount: messages.length,
padding: const EdgeInsets.all(8),
separatorBuilder: (context, index) => const SizedBox(height: 8),
itemBuilder: (BuildContext context, int index) {
final message = messages[index];
return Row(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Flexible(
child: Container(
padding: const EdgeInsets.all(16),
decoration: const BoxDecoration(
color: Color(0xFFE9EAF4),
borderRadius: BorderRadius.only(
topRight: Radius.circular(32.0),
topLeft: Radius.circular(32.0),
bottomLeft: Radius.circular(32.0),
),
),
child: ParsedText(
text: message.text,
style: GoogleFonts.robotoMono(
fontWeight: FontWeight.w500,
color: const Color(0xFF79708F),
),
parse: <MatchText>[
MatchText(
pattern: r"@[A-Za-z0-9_.-]*",
style: const TextStyle(color: Colors.green),
),
MatchText(
pattern: r"\B#+([\w]+)\b",
style: const TextStyle(color: Colors.blue),
),
],
),
),
),
const SizedBox(width: 8),
CircleAvatar(
backgroundImage: NetworkImage(message.sender.avatar),
),
],
);
},
);
}
}

View File

@ -0,0 +1,67 @@
import 'package:example/src/models.dart';
import 'package:flutter/material.dart';
import 'dart:math' show Random;
import 'package:example/src/data.dart';
class ChatMessageTextField extends StatelessWidget {
const ChatMessageTextField({
Key? key,
required this.focusNode,
required this.controller,
required this.onSend,
}) : super(key: key);
final FocusNode focusNode;
final TextEditingController controller;
final ValueSetter<ChatMessage> onSend;
final _sender = const [sahil, avni, gaurav];
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.fromLTRB(16, 4, 4, 4),
decoration: const BoxDecoration(
color: Color(0xFFF7F7F8),
borderRadius: BorderRadius.all(Radius.circular(40.0)),
),
child: Row(
children: [
Expanded(
child: TextField(
focusNode: focusNode,
controller: controller,
decoration: const InputDecoration.collapsed(
hintText: "Type your message...",
),
),
),
IconButton(
onPressed: () {
final message = ChatMessage(
text: controller.text,
createdAt: DateTime.now(),
sender: _sender[Random().nextInt(_sender.length)],
);
onSend(message);
},
padding: const EdgeInsets.all(4),
icon: Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Color(0xFF5B61B9),
),
alignment: Alignment.center,
child: const Icon(
Icons.send_rounded,
color: Colors.white,
size: 24,
),
),
),
],
),
);
}
}

View File

@ -0,0 +1,243 @@
import 'package:example/src/models.dart';
const sahil = User(
id: 'xsahil03x',
name: 'Sahil Kumar',
avatar: 'https://bit.ly/3yEVRrD',
);
const avni = User(
id: 'avu.saxena',
name: 'Avni Saxena',
avatar: 'https://bit.ly/3PbPBii',
);
const trapti = User(
id: 'trapti2711',
name: 'Trapti Gupta',
avatar: 'https://bit.ly/3aDHtba',
);
const gaurav = User(
id: 'itsmegb98',
name: 'Gaurav Bhadouriya',
avatar: 'https://bit.ly/3PmNdES',
);
const amit = User(
id: 'amitk_15',
name: 'Amit Kumar',
avatar: 'https://bit.ly/3P9GPB8',
);
const ayush = User(
id: 'ayushpgupta',
name: 'Ayush Gupta',
avatar: 'https://bit.ly/3Rw61Dv',
);
const shubham = User(
id: 'someshubham',
name: 'Shubham Jain',
avatar: 'https://bit.ly/3Rs3uud',
);
const kUsers = <User>[
sahil,
avni,
gaurav,
trapti,
amit,
ayush,
shubham,
];
const kHashtags = <Hashtag>[
Hashtag(
name: 'dart',
weight: 1,
description:
'Dart is a language for building fast, scalable and maintainable applications.',
image: 'https://dwglogo.com/wp-content/uploads/2018/03/Dart_logo.png',
),
Hashtag(
name: 'flutter',
weight: 2,
description:
'Flutter is a framework for building native Android and iOS applications for Google\'s mobile platforms.',
image:
'https://storage.googleapis.com/cms-storage-bucket/0dbfcc7a59cd1cf16282.png',
),
Hashtag(
name: 'firebase',
weight: 3,
description:
'Firebase is a cloud platform for building mobile and web apps.',
image:
'https://firebase.google.com/static/downloads/brand-guidelines/PNG/logo-logomark.png',
),
Hashtag(
name: 'google',
weight: 4,
description:
'Google is a company that builds products and services for the world\'s users.',
image: 'https://dwglogo.com/wp-content/uploads/2016/06/G-icon-1068x735.png',
),
Hashtag(
name: 'apple',
weight: 5,
description:
'Apple is a company that builds products and services for the world\'s users.',
image:
'https://dwglogo.com/wp-content/uploads/2016/02/Apple_logo-1068x601.png',
),
Hashtag(
name: 'microsoft',
weight: 6,
description:
'Microsoft is a company that builds products and services for the world\'s users.',
image:
'https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Microsoft_logo.svg/2048px-Microsoft_logo.svg.png',
),
Hashtag(
name: 'facebook',
weight: 7,
description:
'Facebook is a company that builds products and services for the world\'s users.',
image: 'https://www.facebook.com/images/fb_icon_325x325.png',
),
Hashtag(
name: 'twitter',
weight: 8,
description:
'Twitter is a company that builds products and services for the world\'s users.',
image:
'https://dwglogo.com/wp-content/uploads/2019/02/Twitter_logo-1024x705.png',
),
Hashtag(
name: 'instagram',
weight: 9,
description:
'Instagram is a company that builds products and services for the world\'s users.',
image:
'https://w7.pngwing.com/pngs/648/943/png-transparent-instagram-logo-logo-instagram-computer-icons-camera-instagram-logo-text-trademark-magenta.png',
),
Hashtag(
name: 'snapchat',
weight: 10,
description:
'Snapchat is a company that builds products and services for the world\'s users.',
image:
'https://dwglogo.com/wp-content/uploads/2016/06/dotted_logo_of_snapchat-1068x601.png',
),
Hashtag(
name: 'youtube',
weight: 11,
description:
'YouTube is a company that builds products and services for the world\'s users.',
image:
'https://dwglogo.com/wp-content/uploads/2020/05/1200px-YouTube_logo-1024x729.png',
),
];
const kEmojis = <Emoji>[
Emoji(
char: '😀',
shortName: ':grinning:',
unicode: '1f600',
),
Emoji(
char: '😂',
shortName: ':joy:',
unicode: '1f602',
),
Emoji(
char: '😃',
shortName: ':smiley:',
unicode: '1f603',
),
Emoji(
char: '😄',
shortName: ':smile:',
unicode: '1f604',
),
Emoji(
char: '😅',
shortName: ':sweat_smile:',
unicode: '1f605',
),
Emoji(
char: '😆',
shortName: ':laughing:',
unicode: '1f606',
),
Emoji(
char: '😇',
shortName: ':wink:',
unicode: '1f609',
),
Emoji(
char: '😈',
shortName: ':smirk:',
unicode: '1f60f',
),
Emoji(
char: '😉',
shortName: ':wink2:',
unicode: '1f609',
),
Emoji(
char: '😊',
shortName: ':blush:',
unicode: '1f60a',
),
Emoji(
char: '😋',
shortName: ':yum:',
unicode: '1f60b',
),
Emoji(
char: '😌',
shortName: ':relieved:',
unicode: '1f60c',
),
Emoji(
char: '😍',
shortName: ':heart_eyes:',
unicode: '1f60d',
),
];
final sampleGroupConversation = [
ChatMessage(
text: 'Hey there! What\'s up?',
createdAt: DateTime.now().subtract(const Duration(seconds: 1)),
sender: sahil,
),
ChatMessage(
text: 'Nothing. Just chilling and watching YouTube. What about you?',
createdAt: DateTime.now().subtract(const Duration(seconds: 2)),
sender: avni,
),
ChatMessage(
text: 'Yeah I know. I\'m in the same position 😂',
createdAt: DateTime.now().subtract(const Duration(seconds: 3)),
sender: sahil,
),
ChatMessage(
text: 'I\'m just trying to get some sleep',
createdAt: DateTime.now().subtract(const Duration(seconds: 4)),
sender: gaurav,
),
ChatMessage(
text:
'Same here! Been watching YouTube for the past 5 hours despite of having so much to do! 😅',
createdAt: DateTime.now().subtract(const Duration(seconds: 5)),
sender: trapti,
),
ChatMessage(
text: 'It\'s hard to be productive',
createdAt: DateTime.now().subtract(const Duration(seconds: 6)),
sender: avni,
),
];

View File

@ -0,0 +1,49 @@
class Emoji {
const Emoji({
required this.char,
required this.shortName,
required this.unicode,
});
final String char;
final String shortName;
final String unicode;
}
class Hashtag {
const Hashtag({
required this.name,
required this.weight,
required this.description,
required this.image,
});
final String name;
final int weight;
final String description;
final String image;
}
class User {
const User({
required this.id,
required this.name,
required this.avatar,
});
final String id;
final String name;
final String avatar;
}
class ChatMessage {
const ChatMessage({
required this.text,
required this.createdAt,
required this.sender,
});
final String text;
final DateTime createdAt;
final User sender;
}

View File

@ -0,0 +1,71 @@
import 'package:example/src/data.dart';
import 'package:flutter/material.dart';
import 'package:example/src/models.dart';
class EmojiAutocompleteOptions extends StatelessWidget {
const EmojiAutocompleteOptions({
Key? key,
required this.query,
required this.onEmojiTap,
}) : super(key: key);
final String query;
final ValueSetter<Emoji> onEmojiTap;
@override
Widget build(BuildContext context) {
final emojis = kEmojis.where((it) {
final normalizedOption = it.shortName.toLowerCase();
final normalizedQuery = query.toLowerCase();
return normalizedOption.contains(normalizedQuery);
});
if (emojis.isEmpty) return const SizedBox.shrink();
return Card(
margin: const EdgeInsets.all(8),
elevation: 2,
// color: _streamChatTheme.colorTheme.barsBg,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
clipBehavior: Clip.hardEdge,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
color: const Color(0xFFF7F7F8),
child: ListTile(
dense: true,
horizontalTitleGap: 0,
title: Text("Emoji's matching '$query'"),
),
),
const Divider(height: 0),
LimitedBox(
maxHeight: MediaQuery.of(context).size.height * 0.3,
child: ListView.separated(
padding: EdgeInsets.zero,
shrinkWrap: true,
itemCount: emojis.length,
separatorBuilder: (_, __) => const Divider(height: 0),
itemBuilder: (context, i) {
final emoji = emojis.elementAt(i);
return ListTile(
dense: true,
leading: Text(
emoji.char,
style: const TextStyle(fontSize: 24),
),
title: Text(emoji.shortName),
onTap: () => onEmojiTap(emoji),
);
},
),
),
],
),
);
}
}

View File

@ -0,0 +1,78 @@
import 'package:example/src/data.dart';
import 'package:flutter/material.dart';
import 'package:example/src/models.dart';
class HashtagAutocompleteOptions extends StatelessWidget {
const HashtagAutocompleteOptions({
Key? key,
required this.query,
required this.onHashtagTap,
}) : super(key: key);
final String query;
final ValueSetter<Hashtag> onHashtagTap;
@override
Widget build(BuildContext context) {
final hashtags = kHashtags.where((it) {
final normalizedOption = it.name.toLowerCase();
final normalizedQuery = query.toLowerCase();
return normalizedOption.contains(normalizedQuery);
});
if (hashtags.isEmpty) return const SizedBox.shrink();
return Card(
margin: const EdgeInsets.all(8),
elevation: 2,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
clipBehavior: Clip.hardEdge,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
color: const Color(0xFFE9EAF4),
child: ListTile(
dense: true,
horizontalTitleGap: 0,
title: Text("Hashtags matching '$query'"),
),
),
const Divider(height: 0),
LimitedBox(
maxHeight: MediaQuery.of(context).size.height * 0.3,
child: ListView.separated(
padding: EdgeInsets.zero,
shrinkWrap: true,
itemCount: hashtags.length,
separatorBuilder: (_, __) => const Divider(height: 0),
itemBuilder: (context, i) {
final hashtag = hashtags.elementAt(i);
return ListTile(
dense: true,
leading: CircleAvatar(
backgroundColor: const Color(0xFFF7F7F8),
backgroundImage: NetworkImage(
hashtag.image,
scale: 0.5,
),
),
title: Text('#${hashtag.name}'),
subtitle: Text(
hashtag.description,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
onTap: () => onHashtagTap(hashtag),
);
},
),
),
],
),
);
}
}

View File

@ -0,0 +1,71 @@
import 'package:example/src/data.dart';
import 'package:flutter/material.dart';
import 'package:example/src/models.dart';
class MentionAutocompleteOptions extends StatelessWidget {
const MentionAutocompleteOptions({
Key? key,
required this.query,
required this.onMentionUserTap,
}) : super(key: key);
final String query;
final ValueSetter<User> onMentionUserTap;
@override
Widget build(BuildContext context) {
final users = kUsers.where((it) {
final normalizedId = it.id.toLowerCase();
final normalizedName = it.name.toLowerCase();
final normalizedQuery = query.toLowerCase();
return normalizedId.contains(normalizedQuery) ||
normalizedName.contains(normalizedQuery);
});
if (users.isEmpty) return const SizedBox.shrink();
return Card(
margin: const EdgeInsets.all(8),
elevation: 2,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
clipBehavior: Clip.hardEdge,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
color: const Color(0xFFF7F7F8),
child: ListTile(
dense: true,
horizontalTitleGap: 0,
title: Text("Users matching '$query'"),
),
),
LimitedBox(
maxHeight: MediaQuery.of(context).size.height * 0.3,
child: ListView.separated(
padding: EdgeInsets.zero,
shrinkWrap: true,
itemCount: users.length,
separatorBuilder: (_, __) => const Divider(height: 0),
itemBuilder: (context, i) {
final user = users.elementAt(i);
return ListTile(
dense: true,
leading: CircleAvatar(
backgroundImage: NetworkImage(user.avatar),
),
title: Text(user.name),
subtitle: Text('@${user.id}'),
onTap: () => onMentionUserTap(user),
);
},
),
),
],
),
);
}
}

View File

@ -0,0 +1,3 @@
export 'emoji_autocomplete_options.dart';
export 'hashtag_autocomplete_options.dart';
export 'mention_autocomplete_options.dart';

View File

@ -0,0 +1,364 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
async:
dependency: transitive
description:
name: async
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
url: "https://pub.dev"
source: hosted
version: "2.12.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
characters:
dependency: transitive
description:
name: characters
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev"
source: hosted
version: "1.4.0"
clock:
dependency: transitive
description:
name: clock
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.2"
collection:
dependency: transitive
description:
name: collection
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
source: hosted
version: "1.19.1"
crypto:
dependency: transitive
description:
name: crypto
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
url: "https://pub.dev"
source: hosted
version: "1.0.8"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
url: "https://pub.dev"
source: hosted
version: "1.3.2"
ffi:
dependency: transitive
description:
name: ffi
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
url: "https://pub.dev"
source: hosted
version: "2.0.3"
flutter_parsed_text:
dependency: "direct main"
description:
name: flutter_parsed_text
sha256: "529cf5793b7acdf16ee0f97b158d0d4ba0bf06e7121ef180abe1a5b59e32c1e2"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
flutter_portal:
dependency: transitive
description:
name: flutter_portal
sha256: "4601b3dc24f385b3761721bd852a3f6c09cddd4e943dd184ed58ee1f43006257"
url: "https://pub.dev"
source: hosted
version: "1.1.4"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
google_fonts:
dependency: "direct main"
description:
name: google_fonts
sha256: e20ff62b158b96f392bfc8afe29dee1503c94fbea2cbe8186fd59b756b8ae982
url: "https://pub.dev"
source: hosted
version: "5.1.0"
http:
dependency: transitive
description:
name: http
sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
url: "https://pub.dev"
source: hosted
version: "1.3.0"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
version: "4.1.2"
leak_tracker:
dependency: transitive
description:
name: leak_tracker
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
url: "https://pub.dev"
source: hosted
version: "10.0.8"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
url: "https://pub.dev"
source: hosted
version: "3.0.9"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
lints:
dependency: transitive
description:
name: lints
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
matcher:
dependency: transitive
description:
name: matcher
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
source: hosted
version: "0.12.17"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
url: "https://pub.dev"
source: hosted
version: "1.16.0"
multi_trigger_autocomplete_plus:
dependency: "direct main"
description:
path: ".."
relative: true
source: path
version: "1.0.2"
path:
dependency: transitive
description:
name: path
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
path_provider:
dependency: transitive
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
version: "2.1.5"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
url: "https://pub.dev"
source: hosted
version: "2.2.15"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
source: hosted
version: "2.3.0"
platform:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
source_span:
dependency: transitive
description:
name: source_span
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
url: "https://pub.dev"
source: hosted
version: "1.10.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
version: "1.12.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev"
source: hosted
version: "1.4.1"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev"
source: hosted
version: "1.2.2"
test_api:
dependency: transitive
description:
name: test_api
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
url: "https://pub.dev"
source: hosted
version: "0.7.4"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.4.0"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
url: "https://pub.dev"
source: hosted
version: "14.3.1"
web:
dependency: transitive
description:
name: web
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
url: "https://pub.dev"
source: hosted
version: "1.1.0"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
sdks:
dart: ">=3.7.0-0 <4.0.0"
flutter: ">=3.24.0"

View File

@ -0,0 +1,91 @@
name: example
description: A new Flutter project.
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: "none" # Remove this line if you wish to publish to pub.dev
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1
environment:
sdk: ">=2.18.0 <4.0.0"
# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
# consider running `flutter pub upgrade --major-versions`. Alternatively,
# dependencies can be manually updated by changing the version numbers below to
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run `flutter pub outdated`.
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.5
flutter_parsed_text: ^2.2.1
google_fonts: ^5.0.0
multi_trigger_autocomplete_plus:
path: ../
dev_dependencies:
flutter_test:
sdk: flutter
# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^2.0.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter packages.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware
# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages
# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages

View File

@ -0,0 +1,4 @@
# melos_managed_dependency_overrides: multi_trigger_autocomplete_plus
dependency_overrides:
multi_trigger_autocomplete_plus:
path: ..