Krille/design improvements

This commit is contained in:
Christian Pauly 2020-06-24 07:42:28 +00:00
parent cc95f119b3
commit a263da8bf8
7 changed files with 160 additions and 165 deletions

View File

@ -1,5 +1,37 @@
PODS: PODS:
- DKImagePickerController/Core (4.2.2):
- DKImagePickerController/ImageDataManager
- DKImagePickerController/Resource
- DKImagePickerController/ImageDataManager (4.2.2)
- DKImagePickerController/PhotoGallery (4.2.2):
- DKImagePickerController/Core
- DKPhotoGallery
- DKImagePickerController/Resource (4.2.2)
- DKPhotoGallery (0.0.14):
- DKPhotoGallery/Core (= 0.0.14)
- DKPhotoGallery/Model (= 0.0.14)
- DKPhotoGallery/Preview (= 0.0.14)
- DKPhotoGallery/Resource (= 0.0.14)
- SDWebImage
- SDWebImageFLPlugin
- DKPhotoGallery/Core (0.0.14):
- DKPhotoGallery/Model
- DKPhotoGallery/Preview
- SDWebImage
- SDWebImageFLPlugin
- DKPhotoGallery/Model (0.0.14):
- SDWebImage
- SDWebImageFLPlugin
- DKPhotoGallery/Preview (0.0.14):
- DKPhotoGallery/Model
- DKPhotoGallery/Resource
- SDWebImage
- SDWebImageFLPlugin
- DKPhotoGallery/Resource (0.0.14):
- SDWebImage
- SDWebImageFLPlugin
- file_picker (0.0.1): - file_picker (0.0.1):
- DKImagePickerController/PhotoGallery
- Flutter - Flutter
- Firebase/Core (6.27.0): - Firebase/Core (6.27.0):
- Firebase/CoreOnly - Firebase/CoreOnly
@ -49,11 +81,14 @@ PODS:
- GoogleUtilities/Reachability (~> 6.5) - GoogleUtilities/Reachability (~> 6.5)
- GoogleUtilities/UserDefaults (~> 6.5) - GoogleUtilities/UserDefaults (~> 6.5)
- Protobuf (>= 3.9.2, ~> 3.9) - Protobuf (>= 3.9.2, ~> 3.9)
- FLAnimatedImage (1.0.12)
- Flutter (1.0.0) - Flutter (1.0.0)
- flutter_keyboard_visibility (0.7.0): - flutter_keyboard_visibility (0.7.0):
- Flutter - Flutter
- flutter_local_notifications (0.0.1): - flutter_local_notifications (0.0.1):
- Flutter - Flutter
- flutter_plugin_android_lifecycle (0.0.1):
- Flutter
- flutter_secure_storage (3.3.1): - flutter_secure_storage (3.3.1):
- Flutter - Flutter
- flutter_sound (0.0.1): - flutter_sound (0.0.1):
@ -112,6 +147,12 @@ PODS:
- Protobuf (3.12.0) - Protobuf (3.12.0)
- receive_sharing_intent (0.0.1): - receive_sharing_intent (0.0.1):
- Flutter - Flutter
- SDWebImage (5.8.1):
- SDWebImage/Core (= 5.8.1)
- SDWebImage/Core (5.8.1)
- SDWebImageFLPlugin (0.4.0):
- FLAnimatedImage (>= 1.0.11)
- SDWebImage/Core (~> 5.6)
- share (0.5.2): - share (0.5.2):
- Flutter - Flutter
- sqflite (0.0.1): - sqflite (0.0.1):
@ -140,6 +181,7 @@ DEPENDENCIES:
- Flutter (from `Flutter`) - Flutter (from `Flutter`)
- flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`)
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- flutter_plugin_android_lifecycle (from `.symlinks/plugins/flutter_plugin_android_lifecycle/ios`)
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
- flutter_sound (from `.symlinks/plugins/flutter_sound/ios`) - flutter_sound (from `.symlinks/plugins/flutter_sound/ios`)
- image_picker (from `.symlinks/plugins/image_picker/ios`) - image_picker (from `.symlinks/plugins/image_picker/ios`)
@ -157,6 +199,8 @@ DEPENDENCIES:
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- DKImagePickerController
- DKPhotoGallery
- Firebase - Firebase
- FirebaseAnalytics - FirebaseAnalytics
- FirebaseCore - FirebaseCore
@ -164,6 +208,7 @@ SPEC REPOS:
- FirebaseInstallations - FirebaseInstallations
- FirebaseInstanceID - FirebaseInstanceID
- FirebaseMessaging - FirebaseMessaging
- FLAnimatedImage
- FMDB - FMDB
- GoogleAppMeasurement - GoogleAppMeasurement
- GoogleDataTransport - GoogleDataTransport
@ -173,6 +218,8 @@ SPEC REPOS:
- OLMKit - OLMKit
- PromisesObjC - PromisesObjC
- Protobuf - Protobuf
- SDWebImage
- SDWebImageFLPlugin
- SQLCipher - SQLCipher
EXTERNAL SOURCES: EXTERNAL SOURCES:
@ -186,6 +233,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_keyboard_visibility/ios" :path: ".symlinks/plugins/flutter_keyboard_visibility/ios"
flutter_local_notifications: flutter_local_notifications:
:path: ".symlinks/plugins/flutter_local_notifications/ios" :path: ".symlinks/plugins/flutter_local_notifications/ios"
flutter_plugin_android_lifecycle:
:path: ".symlinks/plugins/flutter_plugin_android_lifecycle/ios"
flutter_secure_storage: flutter_secure_storage:
:path: ".symlinks/plugins/flutter_secure_storage/ios" :path: ".symlinks/plugins/flutter_secure_storage/ios"
flutter_sound: flutter_sound:
@ -214,7 +263,9 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/webview_flutter/ios" :path: ".symlinks/plugins/webview_flutter/ios"
SPEC CHECKSUMS: SPEC CHECKSUMS:
file_picker: 408623be2125b79a4539cf703be3d4b3abe5e245 DKImagePickerController: 4a3e7948a848c4348e600b3fe5ce41478835fa10
DKPhotoGallery: 0290d32343574f06eaa4c26f8f2f8a1035e916be
file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1
Firebase: fc4cbf6f1592636431821ef9a3c557e4dfd9f268 Firebase: fc4cbf6f1592636431821ef9a3c557e4dfd9f268
firebase_messaging: cffb57ce40958c6204f03fb0c81713e4cd1e240c firebase_messaging: cffb57ce40958c6204f03fb0c81713e4cd1e240c
FirebaseAnalytics: 0ea640473474f036cabbc2576e20c2d63671c92f FirebaseAnalytics: 0ea640473474f036cabbc2576e20c2d63671c92f
@ -223,9 +274,11 @@ SPEC CHECKSUMS:
FirebaseInstallations: 293f567159b6d66d1c990f13bb868066096c94ec FirebaseInstallations: 293f567159b6d66d1c990f13bb868066096c94ec
FirebaseInstanceID: 3b119bfe90e904851218159c9a4ecb847cc51d18 FirebaseInstanceID: 3b119bfe90e904851218159c9a4ecb847cc51d18
FirebaseMessaging: ad9e1a80ea64905e01a0ce1b3eb76a2944544151 FirebaseMessaging: ad9e1a80ea64905e01a0ce1b3eb76a2944544151
FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
flutter_keyboard_visibility: 6195387fb6d8f46e5cd6dda4a4154e41f800f545 flutter_keyboard_visibility: 6195387fb6d8f46e5cd6dda4a4154e41f800f545
flutter_local_notifications: 9e4738ce2471c5af910d961a6b7eadcf57c50186 flutter_local_notifications: 9e4738ce2471c5af910d961a6b7eadcf57c50186
flutter_plugin_android_lifecycle: dc0b544e129eebb77a6bfb1239d4d1c673a60a35
flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec
flutter_sound: 0e8163ceac1e00eb6d894e2ae4641ba726a2c479 flutter_sound: 0e8163ceac1e00eb6d894e2ae4641ba726a2c479
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
@ -233,7 +286,7 @@ SPEC CHECKSUMS:
GoogleDataTransport: 9a8a16f79feffc7f42096743de2a7c4815e84020 GoogleDataTransport: 9a8a16f79feffc7f42096743de2a7c4815e84020
GoogleDataTransportCCTSupport: 489c1265d2c85b68187a83a911913d190012158d GoogleDataTransportCCTSupport: 489c1265d2c85b68187a83a911913d190012158d
GoogleUtilities: 39530bc0ad980530298e9c4af8549e991fd033b1 GoogleUtilities: 39530bc0ad980530298e9c4af8549e991fd033b1
image_picker: e3eacd46b94694dde7cf2705955cece853aa1a8f image_picker: 66aa71bc96850a90590a35d4c4a2907b0d823109
nanopb: c43f40fadfe79e8b8db116583945847910cbabc9 nanopb: c43f40fadfe79e8b8db116583945847910cbabc9
OLMKit: 4ee0159d63feeb86d836fdcfefe418e163511639 OLMKit: 4ee0159d63feeb86d836fdcfefe418e163511639
open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d
@ -241,6 +294,8 @@ SPEC CHECKSUMS:
PromisesObjC: b48e0338dbbac2207e611750777895f7a5811b75 PromisesObjC: b48e0338dbbac2207e611750777895f7a5811b75
Protobuf: 2793fcd0622a00b546c60e7cbbcc493e043e9bb9 Protobuf: 2793fcd0622a00b546c60e7cbbcc493e043e9bb9
receive_sharing_intent: c0d87310754e74c0f9542947e7cbdf3a0335a3b1 receive_sharing_intent: c0d87310754e74c0f9542947e7cbdf3a0335a3b1
SDWebImage: e3eae2eda88578db0685a0c88597fdadd9433f05
SDWebImageFLPlugin: 6c2295fb1242d44467c6c87dc5db6b0a13228fd8
share: bae0a282aab4483288913fc4dc0b935d4b491f2e share: bae0a282aab4483288913fc4dc0b935d4b491f2e
sqflite: 4001a31ff81d210346b500c55b17f4d6c7589dd0 sqflite: 4001a31ff81d210346b500c55b17f4d6c7589dd0
sqflite_sqlcipher: 45e72be2f26bde6ad196ff8b084123d8634ba921 sqflite_sqlcipher: 45e72be2f26bde6ad196ff8b084123d8634ba921

View File

@ -43,15 +43,17 @@ class PresenceListItem extends StatelessWidget {
width: 80, width: 80,
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
SizedBox(height: 9), SizedBox(height: 16),
Avatar(user.avatarUrl, user.calcDisplayname()), Avatar(user.avatarUrl, user.calcDisplayname()),
Padding( Padding(
padding: const EdgeInsets.all(6.0), padding: const EdgeInsets.only(left: 6.0, top: 6.0, right: 6.0),
child: Text( child: Text(
user.calcDisplayname(), user.calcDisplayname(),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
maxLines: 1, maxLines: 1,
style: TextStyle( style: TextStyle(
color: Color(0xFF555555),
fontSize: 13,
fontWeight: presence?.presence?.statusMsg == null fontWeight: presence?.presence?.statusMsg == null
? null ? null
: FontWeight.bold, : FontWeight.bold,

View File

@ -7,6 +7,6 @@ extension StringColor on String {
number += codeUnitAt(i); number += codeUnitAt(i);
} }
number = (number % 10) * 25.5; number = (number % 10) * 25.5;
return HSLColor.fromAHSL(1, number, 1, 0.35).toColor(); return HSLColor.fromAHSL(1, number, 1, 0.66).toColor();
} }
} }

View File

@ -345,9 +345,7 @@ class _ChatState extends State<_Chat> {
} }
return Scaffold( return Scaffold(
extendBodyBehindAppBar: true,
appBar: AppBar( appBar: AppBar(
backgroundColor: Theme.of(context).appBarTheme.color.withOpacity(0.95),
leading: selectMode leading: selectMode
? IconButton( ? IconButton(
icon: Icon(Icons.close), icon: Icon(Icons.close),
@ -587,7 +585,7 @@ class _ChatState extends State<_Chat> {
Theme.of(context).backgroundColor.withOpacity(0.8), Theme.of(context).backgroundColor.withOpacity(0.8),
), ),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: selectMode children: selectMode
? <Widget>[ ? <Widget>[
@ -638,80 +636,88 @@ class _ChatState extends State<_Chat> {
] ]
: <Widget>[ : <Widget>[
if (inputText.isEmpty) if (inputText.isEmpty)
PopupMenuButton<String>( Container(
icon: Icon(Icons.add), height: 56,
onSelected: (String choice) async { alignment: Alignment.center,
if (choice == 'file') { child: PopupMenuButton<String>(
sendFileAction(context); icon: Icon(Icons.add),
} else if (choice == 'image') { onSelected: (String choice) async {
sendImageAction(context); if (choice == 'file') {
} sendFileAction(context);
if (choice == 'camera') { } else if (choice == 'image') {
openCameraAction(context); sendImageAction(context);
} }
if (choice == 'voice') { if (choice == 'camera') {
voiceMessageAction(context); openCameraAction(context);
} }
}, if (choice == 'voice') {
itemBuilder: (BuildContext context) => voiceMessageAction(context);
<PopupMenuEntry<String>>[ }
PopupMenuItem<String>( },
value: 'file', itemBuilder: (BuildContext context) =>
child: ListTile( <PopupMenuEntry<String>>[
leading: CircleAvatar(
backgroundColor: Colors.green,
foregroundColor: Colors.white,
child: Icon(Icons.attachment),
),
title:
Text(L10n.of(context).sendFile),
contentPadding: EdgeInsets.all(0),
),
),
PopupMenuItem<String>(
value: 'image',
child: ListTile(
leading: CircleAvatar(
backgroundColor: Colors.blue,
foregroundColor: Colors.white,
child: Icon(Icons.image),
),
title:
Text(L10n.of(context).sendImage),
contentPadding: EdgeInsets.all(0),
),
),
if (!kIsWeb)
PopupMenuItem<String>( PopupMenuItem<String>(
value: 'camera', value: 'file',
child: ListTile( child: ListTile(
leading: CircleAvatar( leading: CircleAvatar(
backgroundColor: Colors.purple, backgroundColor: Colors.green,
foregroundColor: Colors.white, foregroundColor: Colors.white,
child: Icon(Icons.camera_alt), child: Icon(Icons.attachment),
), ),
title: Text( title:
L10n.of(context).openCamera), Text(L10n.of(context).sendFile),
contentPadding: EdgeInsets.all(0), contentPadding: EdgeInsets.all(0),
), ),
), ),
if (!kIsWeb)
PopupMenuItem<String>( PopupMenuItem<String>(
value: 'voice', value: 'image',
child: ListTile( child: ListTile(
leading: CircleAvatar( leading: CircleAvatar(
backgroundColor: Colors.red, backgroundColor: Colors.blue,
foregroundColor: Colors.white, foregroundColor: Colors.white,
child: Icon(Icons.mic), child: Icon(Icons.image),
), ),
title: Text( title: Text(
L10n.of(context).voiceMessage), L10n.of(context).sendImage),
contentPadding: EdgeInsets.all(0), contentPadding: EdgeInsets.all(0),
), ),
), ),
], if (!kIsWeb)
PopupMenuItem<String>(
value: 'camera',
child: ListTile(
leading: CircleAvatar(
backgroundColor: Colors.purple,
foregroundColor: Colors.white,
child: Icon(Icons.camera_alt),
),
title: Text(
L10n.of(context).openCamera),
contentPadding: EdgeInsets.all(0),
),
),
if (!kIsWeb)
PopupMenuItem<String>(
value: 'voice',
child: ListTile(
leading: CircleAvatar(
backgroundColor: Colors.red,
foregroundColor: Colors.white,
child: Icon(Icons.mic),
),
title: Text(L10n.of(context)
.voiceMessage),
contentPadding: EdgeInsets.all(0),
),
),
],
),
), ),
EncryptionButton(room), Container(
height: 56,
alignment: Alignment.center,
child: EncryptionButton(room),
),
Expanded( Expanded(
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
@ -733,6 +739,7 @@ class _ChatState extends State<_Chat> {
decoration: InputDecoration( decoration: InputDecoration(
hintText: hintText:
L10n.of(context).writeAMessage, L10n.of(context).writeAMessage,
hintMaxLines: 1,
border: InputBorder.none, border: InputBorder.none,
), ),
onChanged: (String text) { onChanged: (String text) {
@ -760,15 +767,23 @@ class _ChatState extends State<_Chat> {
), ),
), ),
if (!kIsWeb && inputText.isEmpty) if (!kIsWeb && inputText.isEmpty)
IconButton( Container(
icon: Icon(Icons.mic), height: 56,
onPressed: () => alignment: Alignment.center,
voiceMessageAction(context), child: IconButton(
icon: Icon(Icons.mic),
onPressed: () =>
voiceMessageAction(context),
),
), ),
if (kIsWeb || inputText.isNotEmpty) if (kIsWeb || inputText.isNotEmpty)
IconButton( Container(
icon: Icon(Icons.send), height: 56,
onPressed: () => send(), alignment: Alignment.center,
child: IconButton(
icon: Icon(Icons.send),
onPressed: () => send(),
),
), ),
], ],
), ),

View File

@ -8,11 +8,8 @@ import 'package:fluffychat/components/list_items/presence_list_item.dart';
import 'package:fluffychat/components/list_items/public_room_list_item.dart'; import 'package:fluffychat/components/list_items/public_room_list_item.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:receive_sharing_intent/receive_sharing_intent.dart'; import 'package:receive_sharing_intent/receive_sharing_intent.dart';
import 'package:share/share.dart'; import 'package:share/share.dart';
import '../components/theme_switcher.dart';
import '../components/adaptive_page_layout.dart'; import '../components/adaptive_page_layout.dart';
import '../components/list_items/chat_list_item.dart'; import '../components/list_items/chat_list_item.dart';
import '../components/matrix.dart'; import '../components/matrix.dart';
@ -289,7 +286,7 @@ class _ChatListState extends State<ChatList> {
), ),
), ),
appBar: AppBar( appBar: AppBar(
elevation: _scrolledToTop ? 0 : null, //elevation: _scrolledToTop ? 0 : null,
leading: selectMode != SelectMode.share leading: selectMode != SelectMode.share
? null ? null
: IconButton( : IconButton(
@ -297,60 +294,19 @@ class _ChatListState extends State<ChatList> {
onPressed: () => onPressed: () =>
Matrix.of(context).shareContent = null, Matrix.of(context).shareContent = null,
), ),
automaticallyImplyLeading: false,
titleSpacing: 0, titleSpacing: 0,
title: selectMode == SelectMode.share title: selectMode == SelectMode.share
? Text(L10n.of(context).share) ? Text(L10n.of(context).share)
: Container( : Padding(
height: 42, padding: EdgeInsets.all(8),
margin: EdgeInsets.symmetric(horizontal: 8), child: Expanded(
child: Material( child: TextField(
elevation: 5, autocorrect: false,
borderRadius: BorderRadius.circular(7), controller: searchController,
child: Padding( decoration: InputDecoration(
padding: EdgeInsets.all(8), contentPadding: EdgeInsets.all(9),
child: Row( border: InputBorder.none,
children: [ hintText: L10n.of(context).searchForAChat,
Builder(
builder: (context) => IconButton(
padding: EdgeInsets.zero,
icon: Icon(Icons.menu),
onPressed: () =>
Scaffold.of(context).openDrawer(),
),
),
Expanded(
child: TextField(
autocorrect: false,
controller: searchController,
decoration: InputDecoration(
contentPadding: EdgeInsets.all(9),
border: InputBorder.none,
hintText:
L10n.of(context).searchForAChat,
),
),
),
loadingPublicRooms
? Container(
alignment: Alignment.centerRight,
child: Container(
width: 20,
height: 20,
child:
CircularProgressIndicator(),
),
)
: IconButton(
padding: EdgeInsets.zero,
icon: Icon(Icons.account_circle),
onPressed: () =>
Navigator.of(context).push(
AppRoute.defaultRoute(
context,
SettingsView())),
),
],
), ),
), ),
), ),
@ -360,39 +316,14 @@ class _ChatListState extends State<ChatList> {
(AdaptivePageLayout.columnMode(context) || (AdaptivePageLayout.columnMode(context) ||
selectMode == SelectMode.share) selectMode == SelectMode.share)
? null ? null
: SpeedDial( : FloatingActionButton(
child: Icon(Icons.add), child: Icon(Icons.add),
overlayColor: blackWhiteColor(context),
foregroundColor: Colors.white,
backgroundColor: Theme.of(context).primaryColor, backgroundColor: Theme.of(context).primaryColor,
children: [ onPressed: () => Navigator.of(context)
SpeedDialChild( .pushAndRemoveUntil(
child: Icon(Icons.people_outline), AppRoute.defaultRoute(
foregroundColor: Colors.white, context, NewPrivateChatView()),
backgroundColor: Colors.blue, (r) => r.isFirst),
label: L10n.of(context).createNewGroup,
labelStyle: TextStyle(
fontSize: 18.0, color: Colors.black),
onTap: () => Navigator.of(context)
.pushAndRemoveUntil(
AppRoute.defaultRoute(
context, NewGroupView()),
(r) => r.isFirst),
),
SpeedDialChild(
child: Icon(Icons.person_add),
foregroundColor: Colors.white,
backgroundColor: Colors.green,
label: L10n.of(context).newPrivateChat,
labelStyle: TextStyle(
fontSize: 18.0, color: Colors.black),
onTap: () => Navigator.of(context)
.pushAndRemoveUntil(
AppRoute.defaultRoute(
context, NewPrivateChatView()),
(r) => r.isFirst),
),
],
), ),
body: StreamBuilder( body: StreamBuilder(
stream: Matrix.of(context).client.onSync.stream, stream: Matrix.of(context).client.onSync.stream,

View File

@ -260,13 +260,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
flutter_speed_dial:
dependency: "direct main"
description:
name: flutter_speed_dial
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.5"
flutter_svg: flutter_svg:
dependency: transitive dependency: transitive
description: description:

View File

@ -32,7 +32,6 @@ dependencies:
localstorage: ^3.0.1+4 localstorage: ^3.0.1+4
bubble: ^1.1.9+1 bubble: ^1.1.9+1
memoryfilepicker: ^0.1.1 memoryfilepicker: ^0.1.1
flutter_speed_dial: ^1.2.5
url_launcher: ^5.4.1 url_launcher: ^5.4.1
url_launcher_web: ^0.1.0 url_launcher_web: ^0.1.0
sqflite: ^1.2.0 sqflite: ^1.2.0