refactor: Update dependencies

This commit is contained in:
Krille 2023-07-13 19:46:10 +09:00
parent 5d67564445
commit 1911004d05
No known key found for this signature in database
20 changed files with 422 additions and 293 deletions

View File

@ -869,8 +869,11 @@ class ChatController extends State<ChatPageWithRoom> {
setState(() => showEmojiPicker = false); setState(() => showEmojiPicker = false);
if (emoji == null) return; if (emoji == null) return;
// make sure we don't send the same emoji twice // make sure we don't send the same emoji twice
if (_allReactionEvents if (_allReactionEvents.any(
.any((e) => e.content['m.relates_to']['key'] == emoji.emoji)) return; (e) => e.content.tryGetMap('m.relates_to')?['key'] == emoji.emoji,
)) {
return;
}
return sendEmojiAction(emoji.emoji); return sendEmojiAction(emoji.emoji);
} }

View File

@ -61,7 +61,7 @@ class MessageReactions extends StatelessWidget {
final evt = allReactionEvents.firstWhereOrNull( final evt = allReactionEvents.firstWhereOrNull(
(e) => (e) =>
e.senderId == e.room.client.userID && e.senderId == e.room.client.userID &&
e.content['m.relates_to']['key'] == r.key, e.content.tryGetMap('m.relates_to')?['key'] == r.key,
); );
if (evt != null) { if (evt != null) {
showFutureLoadingDialog( showFutureLoadingDialog(

View File

@ -52,7 +52,8 @@ class EventVideoPlayerState extends State<EventVideoPlayer> {
final networkUri = _networkUri; final networkUri = _networkUri;
if (kIsWeb && networkUri != null && _chewieManager == null) { if (kIsWeb && networkUri != null && _chewieManager == null) {
_chewieManager ??= ChewieController( _chewieManager ??= ChewieController(
videoPlayerController: VideoPlayerController.network(networkUri), videoPlayerController:
VideoPlayerController.networkUrl(Uri.parse(networkUri)),
autoPlay: true, autoPlay: true,
autoInitialize: true, autoInitialize: true,
); );

View File

@ -183,12 +183,13 @@ class InputBar extends StatelessWidget {
final state = r.getState(EventTypes.RoomCanonicalAlias); final state = r.getState(EventTypes.RoomCanonicalAlias);
if ((state != null && if ((state != null &&
((state.content['alias'] is String && ((state.content['alias'] is String &&
state.content['alias'] state.content
.tryGet<String>('alias')!
.split(':')[0] .split(':')[0]
.toLowerCase() .toLowerCase()
.contains(roomSearch)) || .contains(roomSearch)) ||
(state.content['alt_aliases'] is List && (state.content['alt_aliases'] is List &&
state.content['alt_aliases'].any( (state.content['alt_aliases'] as List).any(
(l) => (l) =>
l is String && l is String &&
l l

View File

@ -52,7 +52,7 @@ class ReactionsPicker extends StatelessWidget {
for (final event in allReactionEvents) { for (final event in allReactionEvents) {
try { try {
emojis.remove(event.content['m.relates_to']['key']); emojis.remove(event.content.tryGetMap('m.relates_to')!['key']);
} catch (_) {} } catch (_) {}
} }
return Row( return Row(

View File

@ -83,7 +83,9 @@ class ChatDetailsController extends State<ChatDetails> {
RequestType.GET, RequestType.GET,
'/client/unstable/org.matrix.msc2432/rooms/${Uri.encodeComponent(room.id)}/aliases', '/client/unstable/org.matrix.msc2432/rooms/${Uri.encodeComponent(room.id)}/aliases',
) )
.then((response) => List<String>.from(response['aliases'])), .then(
(response) => List<String>.from(response['aliases'] as Iterable),
),
); );
// Switch to the stable api once it is implemented. // Switch to the stable api once it is implemented.

View File

@ -73,8 +73,10 @@ class ChatPermissionsSettingsController extends State<ChatPermissionsSettings> {
void updateRoomAction(Capabilities capabilities) async { void updateRoomAction(Capabilities capabilities) async {
final room = Matrix.of(context).client.getRoomById(roomId!)!; final room = Matrix.of(context).client.getRoomById(roomId!)!;
final String roomVersion = final roomVersion = room
room.getState(EventTypes.RoomCreate)!.content['room_version'] ?? '1'; .getState(EventTypes.RoomCreate)!
.content['room_version'] as String? ??
'1';
final newVersion = await showConfirmationDialog<String>( final newVersion = await showConfirmationDialog<String>(
context: context, context: context,
title: L10n.of(context)!.replaceRoomWithNewerVersion, title: L10n.of(context)!.replaceRoomWithNewerVersion,

View File

@ -127,9 +127,9 @@ class ChatPermissionsSettingsView extends StatelessWidget {
), ),
); );
} }
final String roomVersion = room final roomVersion = room
.getState(EventTypes.RoomCreate)! .getState(EventTypes.RoomCreate)!
.content['room_version'] ?? .content['room_version'] as String? ??
'1'; '1';
return ListTile( return ListTile(

View File

@ -109,6 +109,10 @@ class KeyVerificationPageState extends State<KeyVerificationDialog> {
Widget body; Widget body;
final buttons = <Widget>[]; final buttons = <Widget>[];
switch (widget.request.state) { switch (widget.request.state) {
case KeyVerificationState.showQRSuccess:
case KeyVerificationState.confirmQRScan:
case KeyVerificationState.askChoice:
throw 'Not implemented';
case KeyVerificationState.askSSSS: case KeyVerificationState.askSSSS:
// prompt the user for their ssss passphrase / key // prompt the user for their ssss passphrase / key
final textEditingController = TextEditingController(); final textEditingController = TextEditingController();

View File

@ -59,7 +59,7 @@ class NewPrivateChatView extends StatelessWidget {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
QrImage( QrImageView(
data: data:
'https://matrix.to/#/${Matrix.of(context).client.userID}', 'https://matrix.to/#/${Matrix.of(context).client.userID}',
version: QrVersions.auto, version: QrVersions.auto,

View File

@ -151,12 +151,11 @@ class EmotesSettingsController extends State<EmotesSettings> {
bool isGloballyActive(Client? client) => bool isGloballyActive(Client? client) =>
room != null && room != null &&
client!.accountData['im.ponies.emote_rooms']?.content is Map && client!.accountData['im.ponies.emote_rooms']?.content
client.accountData['im.ponies.emote_rooms']!.content['rooms'] is Map && .tryGetMap<String, Object?>('rooms')
client.accountData['im.ponies.emote_rooms']!.content['rooms'][room!.id] ?.tryGetMap<String, Object?>(room!.id)
is Map && ?.tryGetMap<String, Object?>(stateKey ?? '') !=
client.accountData['im.ponies.emote_rooms']!.content['rooms'][room!.id] null;
[stateKey ?? ''] is Map;
bool get readonly => bool get readonly =>
room == null ? false : !(room!.canSendEvent('im.ponies.room_emotes')); room == null ? false : !(room!.canSendEvent('im.ponies.room_emotes'));

View File

@ -40,16 +40,14 @@ class MultipleEmotesSettingsView extends StatelessWidget {
itemCount: keys.length, itemCount: keys.length,
itemBuilder: (BuildContext context, int i) { itemBuilder: (BuildContext context, int i) {
final event = packs[keys[i]]; final event = packs[keys[i]];
String? packName = keys[i].isNotEmpty ? keys[i] : 'Default Pack'; final eventPack =
if (event != null && event.content['pack'] is Map) { event?.content.tryGetMap<String, Object?>('pack');
if (event.content['pack']['displayname'] is String) { final packName = eventPack?.tryGet<String>('displayname') ??
packName = event.content['pack']['displayname']; eventPack?.tryGet<String>('name') ??
} else if (event.content['pack']['name'] is String) { (keys[i].isNotEmpty ? keys[i] : 'Default Pack');
packName = event.content['pack']['name'];
}
}
return ListTile( return ListTile(
title: Text(packName!), title: Text(packName),
onTap: () async { onTap: () async {
VRouter.of(context).toSegments( VRouter.of(context).toSegments(
['rooms', room.id, 'details', 'emotes', keys[i]], ['rooms', room.id, 'details', 'emotes', keys[i]],

View File

@ -182,8 +182,12 @@ class MatrixLocals extends MatrixLocalizations {
String get noPermission => l10n.noKeyForThisMessage; String get noPermission => l10n.noKeyForThisMessage;
@override @override
String redactedAnEvent(String senderName) { String redactedAnEvent(Event redactedEvent) {
return l10n.redactedAnEvent(senderName); return l10n.redactedAnEvent(
redactedEvent.redactedBecause?.senderFromMemoryOrFallback
.calcLocalizedBodyFallback(this) ??
l10n.user,
);
} }
@override @override
@ -192,8 +196,10 @@ class MatrixLocals extends MatrixLocalizations {
} }
@override @override
String removedBy(String calcDisplayname) { String removedBy(Event redactedEvent) {
return l10n.removedBy(calcDisplayname); return l10n.removedBy(
redactedEvent.senderFromMemoryOrFallback.calcLocalizedBodyFallback(this),
);
} }
@override @override

View File

@ -10,6 +10,7 @@
#include <desktop_lifecycle/desktop_lifecycle_plugin.h> #include <desktop_lifecycle/desktop_lifecycle_plugin.h>
#include <dynamic_color/dynamic_color_plugin.h> #include <dynamic_color/dynamic_color_plugin.h>
#include <emoji_picker_flutter/emoji_picker_flutter_plugin.h> #include <emoji_picker_flutter/emoji_picker_flutter_plugin.h>
#include <file_selector_linux/file_selector_plugin.h>
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h> #include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h> #include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
#include <handy_window/handy_window_plugin.h> #include <handy_window/handy_window_plugin.h>
@ -30,6 +31,9 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) emoji_picker_flutter_registrar = g_autoptr(FlPluginRegistrar) emoji_picker_flutter_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "EmojiPickerFlutterPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "EmojiPickerFlutterPlugin");
emoji_picker_flutter_plugin_register_with_registrar(emoji_picker_flutter_registrar); emoji_picker_flutter_plugin_register_with_registrar(emoji_picker_flutter_registrar);
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin");
flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar);

View File

@ -7,6 +7,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
desktop_lifecycle desktop_lifecycle
dynamic_color dynamic_color
emoji_picker_flutter emoji_picker_flutter
file_selector_linux
flutter_secure_storage_linux flutter_secure_storage_linux
flutter_webrtc flutter_webrtc
handy_window handy_window

View File

@ -12,6 +12,7 @@ import desktop_lifecycle
import device_info_plus import device_info_plus
import dynamic_color import dynamic_color
import emoji_picker_flutter import emoji_picker_flutter
import file_selector_macos
import flutter_app_badger import flutter_app_badger
import flutter_local_notifications import flutter_local_notifications
import flutter_secure_storage_macos import flutter_secure_storage_macos
@ -19,15 +20,18 @@ import flutter_web_auth_2
import flutter_webrtc import flutter_webrtc
import geolocator_apple import geolocator_apple
import just_audio import just_audio
import macos_ui
import macos_window_utils
import package_info_plus import package_info_plus
import path_provider_foundation import path_provider_foundation
import record_macos import record_macos
import share_plus import share_plus
import shared_preferences_macos import shared_preferences_foundation
import sqflite import sqflite
import url_launcher_macos import url_launcher_macos
import video_compress import video_compress
import wakelock_macos import wakelock_macos
import wakelock_plus
import window_to_front import window_to_front
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
@ -38,6 +42,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin")) EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FlutterAppBadgerPlugin.register(with: registry.registrar(forPlugin: "FlutterAppBadgerPlugin")) FlutterAppBadgerPlugin.register(with: registry.registrar(forPlugin: "FlutterAppBadgerPlugin"))
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
@ -45,6 +50,8 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin")) FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin"))
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin"))
MacOSUiPlugin.register(with: registry.registrar(forPlugin: "MacOSUiPlugin"))
MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin"))
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
RecordMacosPlugin.register(with: registry.registrar(forPlugin: "RecordMacosPlugin")) RecordMacosPlugin.register(with: registry.registrar(forPlugin: "RecordMacosPlugin"))
@ -54,5 +61,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
VideoCompressPlugin.register(with: registry.registrar(forPlugin: "VideoCompressPlugin")) VideoCompressPlugin.register(with: registry.registrar(forPlugin: "VideoCompressPlugin"))
WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin"))
WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin"))
WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin")) WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin"))
} }

File diff suppressed because it is too large Load Diff

View File

@ -14,12 +14,12 @@ dependencies:
callkeep: ^0.3.2 callkeep: ^0.3.2
chewie: ^1.3.6 chewie: ^1.3.6
collection: ^1.16.0 collection: ^1.16.0
connectivity_plus: ^3.0.2 connectivity_plus: ^4.0.1
cupertino_icons: any cupertino_icons: any
desktop_drop: ^0.4.0 desktop_drop: ^0.4.0
desktop_lifecycle: ^0.1.0 desktop_lifecycle: ^0.1.0
desktop_notifications: ^0.6.3 desktop_notifications: ^0.6.3
device_info_plus: ^8.0.0 device_info_plus: ^9.0.2
dynamic_color: ^1.6.0 dynamic_color: ^1.6.0
emoji_picker_flutter: ^1.5.1 emoji_picker_flutter: ^1.5.1
emoji_proposal: ^0.0.1 emoji_proposal: ^0.0.1
@ -32,37 +32,37 @@ dependencies:
flutter_app_lock: ^3.0.0 flutter_app_lock: ^3.0.0
flutter_blurhash: ^0.7.0 flutter_blurhash: ^0.7.0
flutter_cache_manager: ^3.3.0 flutter_cache_manager: ^3.3.0
flutter_foreground_task: ^3.10.0 flutter_foreground_task: ^6.0.0+1
flutter_highlighter: ^0.1.1 flutter_highlighter: ^0.1.1
flutter_html: ^3.0.0-beta.2 flutter_html: ^3.0.0-beta.2
flutter_html_table: ^3.0.0-beta.2 flutter_html_table: ^3.0.0-beta.2
flutter_linkify: ^6.0.0 flutter_linkify: ^6.0.0
flutter_local_notifications: ^12.0.2 flutter_local_notifications: ^15.1.0+1
flutter_localizations: flutter_localizations:
sdk: flutter sdk: flutter
flutter_map: ^3.1.0 flutter_map: ^4.0.0
flutter_math_fork: ^0.7.1 flutter_math_fork: ^0.7.1
flutter_olm: ^1.2.0 flutter_olm: ^1.2.0
flutter_openssl_crypto: ^0.1.0 flutter_openssl_crypto: ^0.1.0
flutter_ringtone_player: ^3.1.1 flutter_ringtone_player: ^3.1.1
flutter_secure_storage: ^7.0.1 flutter_secure_storage: ^8.0.0
flutter_typeahead: ^4.3.2 flutter_typeahead: ^4.3.2
flutter_web_auth_2: ^2.1.1 flutter_web_auth_2: ^2.1.1
flutter_webrtc: ^0.9.35 flutter_webrtc: ^0.9.35
future_loading_dialog: ^0.2.3 future_loading_dialog: ^0.2.3
geolocator: ^7.6.2 geolocator: ^7.6.2
handy_window: ^0.1.9 handy_window: ^0.3.1
hive: ^2.2.3 hive: ^2.2.3
hive_flutter: ^1.1.0 hive_flutter: ^1.1.0
http: ^0.13.4 http: ^0.13.4
image_picker: ^0.8.4+8 image_picker: ^1.0.0
intl: any intl: any
just_audio: ^0.9.30 just_audio: ^0.9.30
just_audio_mpv: ^0.1.6 just_audio_mpv: ^0.1.6
keyboard_shortcuts: ^0.1.4 keyboard_shortcuts: ^0.1.4
latlong2: ^0.8.1 latlong2: ^0.8.1
linkify: ^5.0.0 linkify: ^5.0.0
matrix: ^0.20.5 matrix: ^0.22.0
matrix_homeserver_recommendations: ^0.3.0 matrix_homeserver_recommendations: ^0.3.0
native_imaging: ^0.1.0 native_imaging: ^0.1.0
package_info_plus: ^4.0.0 package_info_plus: ^4.0.0
@ -77,12 +77,12 @@ dependencies:
record: ^4.4.4 record: ^4.4.4
scroll_to_index: ^3.0.1 scroll_to_index: ^3.0.1
share_plus: ^7.0.0 share_plus: ^7.0.0
shared_preferences: 2.0.15 # Pinned because https://github.com/flutter/flutter/issues/118401 shared_preferences: ^2.2.0 # Pinned because https://github.com/flutter/flutter/issues/118401
slugify: ^2.0.0 slugify: ^2.0.0
swipe_to_action: ^0.2.0 swipe_to_action: ^0.2.0
tor_detector_web: ^1.1.0 tor_detector_web: ^1.1.0
uni_links: ^0.5.1 uni_links: ^0.5.1
unifiedpush: ^4.0.3 unifiedpush: ^5.0.0
universal_html: ^2.0.8 universal_html: ^2.0.8
url_launcher: ^6.0.20 url_launcher: ^6.0.20
vibration: ^1.7.4-nullsafety.0 vibration: ^1.7.4-nullsafety.0
@ -93,7 +93,7 @@ dependencies:
webrtc_interface: ^1.0.13 webrtc_interface: ^1.0.13
dev_dependencies: dev_dependencies:
dart_code_metrics: ^4.10.1 dart_code_metrics: ^5.7.5
flutter_lints: ^2.0.1 flutter_lints: ^2.0.1
flutter_native_splash: ^2.0.3+1 flutter_native_splash: ^2.0.3+1
flutter_test: flutter_test:

View File

@ -11,6 +11,7 @@
#include <desktop_lifecycle/desktop_lifecycle_plugin.h> #include <desktop_lifecycle/desktop_lifecycle_plugin.h>
#include <dynamic_color/dynamic_color_plugin_c_api.h> #include <dynamic_color/dynamic_color_plugin_c_api.h>
#include <emoji_picker_flutter/emoji_picker_flutter_plugin_c_api.h> #include <emoji_picker_flutter/emoji_picker_flutter_plugin_c_api.h>
#include <file_selector_windows/file_selector_windows.h>
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h> #include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h> #include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <record_windows/record_windows_plugin_c_api.h> #include <record_windows/record_windows_plugin_c_api.h>
@ -29,6 +30,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
EmojiPickerFlutterPluginCApiRegisterWithRegistrar( EmojiPickerFlutterPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("EmojiPickerFlutterPluginCApi")); registry->GetRegistrarForPlugin("EmojiPickerFlutterPluginCApi"));
FileSelectorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FileSelectorWindows"));
FlutterWebRTCPluginRegisterWithRegistrar( FlutterWebRTCPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterWebRTCPlugin")); registry->GetRegistrarForPlugin("FlutterWebRTCPlugin"));
PermissionHandlerWindowsPluginRegisterWithRegistrar( PermissionHandlerWindowsPluginRegisterWithRegistrar(

View File

@ -8,6 +8,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
desktop_lifecycle desktop_lifecycle
dynamic_color dynamic_color
emoji_picker_flutter emoji_picker_flutter
file_selector_windows
flutter_webrtc flutter_webrtc
permission_handler_windows permission_handler_windows
record_windows record_windows