mirror of
https://github.com/dstark5/Openlib.git
synced 2025-05-20 07:56:25 +08:00
added open with feature
This commit is contained in:
@ -1,6 +1,15 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_VIDEOS" />
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
|
||||||
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29"/>
|
||||||
|
|
||||||
<queries>
|
<queries>
|
||||||
<intent>
|
<intent>
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
@ -10,8 +10,15 @@ import 'package:openlib/ui/search_page.dart';
|
|||||||
import 'package:openlib/ui/mylibrary_page.dart';
|
import 'package:openlib/ui/mylibrary_page.dart';
|
||||||
import 'package:openlib/ui/settings_page.dart';
|
import 'package:openlib/ui/settings_page.dart';
|
||||||
import 'package:openlib/services/database.dart' show Sqlite, MyLibraryDb;
|
import 'package:openlib/services/database.dart' show Sqlite, MyLibraryDb;
|
||||||
|
import 'package:openlib/services/files.dart'
|
||||||
|
show moveFilesToAndroidInternalStorage;
|
||||||
import 'package:openlib/state/state.dart'
|
import 'package:openlib/state/state.dart'
|
||||||
show selectedIndexProvider, themeModeProvider, dbProvider;
|
show
|
||||||
|
selectedIndexProvider,
|
||||||
|
themeModeProvider,
|
||||||
|
openPdfWithExternalAppProvider,
|
||||||
|
openEpubWithExternalAppProvider,
|
||||||
|
dbProvider;
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
@ -24,12 +31,25 @@ void main() async {
|
|||||||
Database initDb = await Sqlite.initDb();
|
Database initDb = await Sqlite.initDb();
|
||||||
MyLibraryDb dataBase = MyLibraryDb(dbInstance: initDb);
|
MyLibraryDb dataBase = MyLibraryDb(dbInstance: initDb);
|
||||||
bool isDarkMode = await dataBase.getPreference('darkMode');
|
bool isDarkMode = await dataBase.getPreference('darkMode');
|
||||||
|
bool openPdfwithExternalapp =
|
||||||
|
await dataBase.getPreference('openPdfwithExternalApp');
|
||||||
|
bool openEpubwithExternalapp =
|
||||||
|
await dataBase.getPreference('openEpubwithExternalApp');
|
||||||
|
|
||||||
|
if (Platform.isAndroid) {
|
||||||
|
await moveFilesToAndroidInternalStorage();
|
||||||
|
}
|
||||||
|
|
||||||
runApp(
|
runApp(
|
||||||
ProviderScope(
|
ProviderScope(
|
||||||
overrides: [
|
overrides: [
|
||||||
dbProvider.overrideWithValue(dataBase),
|
dbProvider.overrideWithValue(dataBase),
|
||||||
themeModeProvider.overrideWith(
|
themeModeProvider.overrideWith(
|
||||||
(ref) => isDarkMode ? ThemeMode.dark : ThemeMode.light)
|
(ref) => isDarkMode ? ThemeMode.dark : ThemeMode.light),
|
||||||
|
openPdfWithExternalAppProvider
|
||||||
|
.overrideWith((ref) => openPdfwithExternalapp),
|
||||||
|
openEpubWithExternalAppProvider
|
||||||
|
.overrideWith((ref) => openEpubwithExternalapp)
|
||||||
],
|
],
|
||||||
child: const MyApp(),
|
child: const MyApp(),
|
||||||
),
|
),
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import 'package:path_provider/path_provider.dart';
|
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
|
import 'files.dart';
|
||||||
|
|
||||||
Future<String> _getFilePath(String fileName) async {
|
Future<String> _getFilePath(String fileName) async {
|
||||||
final path = await getApplicationDocumentsDirectory();
|
final path = await getAppDirectoryPath;
|
||||||
return '${path.path}/$fileName';
|
return '$path/$fileName';
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> _reorderMirrors(List<String> mirrors) {
|
List<String> _reorderMirrors(List<String> mirrors) {
|
||||||
|
@ -1,13 +1,58 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
// import 'package:permission_handler/permission_handler.dart';
|
||||||
import 'package:openlib/state/state.dart' show dbProvider, myLibraryProvider;
|
import 'package:openlib/state/state.dart' show dbProvider, myLibraryProvider;
|
||||||
|
|
||||||
Future<String> get getAppDirectoryPath async {
|
Future<String> get getAppDirectoryPath async {
|
||||||
final directory = await getApplicationDocumentsDirectory();
|
if (Platform.isAndroid) {
|
||||||
return directory.path;
|
final directory = await getExternalStorageDirectory();
|
||||||
|
return directory!.path;
|
||||||
|
// // final path = '/storage/emulated/0/Openlib';
|
||||||
|
// print(directory.path);
|
||||||
|
// // File(directory.path).copySync(newPath);
|
||||||
|
// return '/storage/emulated/0/Openlib';
|
||||||
|
} else {
|
||||||
|
final directory = await getApplicationDocumentsDirectory();
|
||||||
|
return directory.path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> moveFilesToAndroidInternalStorage() async {
|
||||||
|
try {
|
||||||
|
final directory = await getApplicationDocumentsDirectory();
|
||||||
|
final directoryExternal = await getExternalStorageDirectory();
|
||||||
|
List<FileSystemEntity> files = Directory(directory.path).listSync();
|
||||||
|
for (var element in files) {
|
||||||
|
if ((element.path.contains('pdf')) || element.path.contains('epub')) {
|
||||||
|
String fileName = element.path.split('/').last;
|
||||||
|
File file = File(element.path);
|
||||||
|
file.copySync('${directoryExternal!.path}/$fileName');
|
||||||
|
file.deleteSync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
print(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Future<void> getStoragePermissionAndroid() async {
|
||||||
|
// if (Platform.isAndroid) {
|
||||||
|
// print("hi");
|
||||||
|
// if (await Permission.storage.status.isGranted ||
|
||||||
|
// await Permission.manageExternalStorage.status.isGranted) {
|
||||||
|
// final storagePermission = await Permission.storage.request().isGranted;
|
||||||
|
// final manageStoragePermission =
|
||||||
|
// await Permission.manageExternalStorage.request().isGranted;
|
||||||
|
// print(storagePermission || manageStoragePermission);
|
||||||
|
// if (storagePermission || manageStoragePermission) {
|
||||||
|
// await openAppSettings();
|
||||||
|
// print(storagePermission || manageStoragePermission);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
Future<bool> isFileExists(String filePath) async {
|
Future<bool> isFileExists(String filePath) async {
|
||||||
return await File(filePath).exists();
|
return await File(filePath).exists();
|
||||||
}
|
}
|
||||||
|
@ -144,6 +144,9 @@ final getBookPosition =
|
|||||||
return await ref.read(dbProvider).getBookState(fileName);
|
return await ref.read(dbProvider).getBookState(fileName);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
final openPdfWithExternalAppProvider = StateProvider<bool>((ref) => false);
|
||||||
|
final openEpubWithExternalAppProvider = StateProvider<bool>((ref) => false);
|
||||||
|
|
||||||
final filePathProvider =
|
final filePathProvider =
|
||||||
FutureProvider.family<String, String>((ref, fileName) async {
|
FutureProvider.family<String, String>((ref, fileName) async {
|
||||||
String path = await getFilePath(fileName);
|
String path = await getFilePath(fileName);
|
||||||
|
@ -3,7 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
|
|
||||||
import 'package:openlib/ui/components/delete_dialog_widget.dart';
|
import 'package:openlib/ui/components/delete_dialog_widget.dart';
|
||||||
import 'package:openlib/ui/epub_viewer.dart' show launchEpubViewer;
|
import 'package:openlib/ui/epub_viewer.dart' show launchEpubViewer;
|
||||||
import 'package:openlib/ui/pdf_viewer.dart';
|
import 'package:openlib/ui/pdf_viewer.dart' show launchPdfViewer;
|
||||||
|
|
||||||
class FileOpenAndDeleteButtons extends ConsumerWidget {
|
class FileOpenAndDeleteButtons extends ConsumerWidget {
|
||||||
final String id;
|
final String id;
|
||||||
@ -35,12 +35,8 @@ class FileOpenAndDeleteButtons extends ConsumerWidget {
|
|||||||
)),
|
)),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
if (format == 'pdf') {
|
if (format == 'pdf') {
|
||||||
Navigator.push(context,
|
await launchPdfViewer(
|
||||||
MaterialPageRoute(builder: (BuildContext context) {
|
fileName: '$id.$format', context: context, ref: ref);
|
||||||
return PdfView(
|
|
||||||
fileName: '$id.$format',
|
|
||||||
);
|
|
||||||
}));
|
|
||||||
} else {
|
} else {
|
||||||
await launchEpubViewer(
|
await launchEpubViewer(
|
||||||
fileName: '$id.$format', context: context, ref: ref);
|
fileName: '$id.$format', context: context, ref: ref);
|
||||||
|
@ -4,11 +4,17 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:epub_view/epub_view.dart';
|
import 'package:epub_view/epub_view.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:vocsy_epub_viewer/epub_viewer.dart';
|
import 'package:vocsy_epub_viewer/epub_viewer.dart';
|
||||||
|
import 'package:open_file/open_file.dart';
|
||||||
|
|
||||||
import 'package:openlib/services/files.dart';
|
import 'package:openlib/services/files.dart' show getFilePath;
|
||||||
import 'package:openlib/ui/components/snack_bar_widget.dart';
|
import 'package:openlib/ui/components/snack_bar_widget.dart';
|
||||||
import 'package:openlib/state/state.dart'
|
import 'package:openlib/state/state.dart'
|
||||||
show filePathProvider, saveEpubState, dbProvider, getBookPosition;
|
show
|
||||||
|
filePathProvider,
|
||||||
|
saveEpubState,
|
||||||
|
dbProvider,
|
||||||
|
getBookPosition,
|
||||||
|
openEpubWithExternalAppProvider;
|
||||||
|
|
||||||
Future<void> launchEpubViewer(
|
Future<void> launchEpubViewer(
|
||||||
{required String fileName,
|
{required String fileName,
|
||||||
@ -17,31 +23,36 @@ Future<void> launchEpubViewer(
|
|||||||
if (Platform.isAndroid || Platform.isIOS) {
|
if (Platform.isAndroid || Platform.isIOS) {
|
||||||
String path = await getFilePath(fileName);
|
String path = await getFilePath(fileName);
|
||||||
String? epubConfig = await ref.read(dbProvider).getBookState(fileName);
|
String? epubConfig = await ref.read(dbProvider).getBookState(fileName);
|
||||||
|
bool openWithExternalApp = ref.watch(openEpubWithExternalAppProvider);
|
||||||
|
|
||||||
try {
|
if (openWithExternalApp) {
|
||||||
VocsyEpub.setConfig(
|
await OpenFile.open(path);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
VocsyEpub.setConfig(
|
||||||
|
// ignore: use_build_context_synchronously
|
||||||
|
themeColor: const Color.fromARGB(255, 210, 15, 1),
|
||||||
|
identifier: "iosBook",
|
||||||
|
scrollDirection: EpubScrollDirection.HORIZONTAL,
|
||||||
|
);
|
||||||
|
|
||||||
|
if ((epubConfig?.isNotEmpty ?? true) &&
|
||||||
|
(epubConfig != null) &&
|
||||||
|
(!(epubConfig.startsWith('epubcfi')))) {
|
||||||
|
VocsyEpub.open(path,
|
||||||
|
lastLocation: EpubLocator.fromJson(json.decode(epubConfig)));
|
||||||
|
} else {
|
||||||
|
VocsyEpub.open(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
VocsyEpub.locatorStream.listen((locator) async {
|
||||||
|
await saveEpubState(fileName, locator, ref);
|
||||||
|
// convert locator from string to json and save to your database to be retrieved later
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
themeColor: const Color.fromARGB(255, 210, 15, 1),
|
showSnackBar(context: context, message: 'Unable to open pdf!');
|
||||||
identifier: "iosBook",
|
|
||||||
scrollDirection: EpubScrollDirection.HORIZONTAL,
|
|
||||||
);
|
|
||||||
|
|
||||||
if ((epubConfig?.isNotEmpty ?? true) &&
|
|
||||||
(epubConfig != null) &&
|
|
||||||
(!(epubConfig.startsWith('epubcfi')))) {
|
|
||||||
VocsyEpub.open(path,
|
|
||||||
lastLocation: EpubLocator.fromJson(json.decode(epubConfig)));
|
|
||||||
} else {
|
|
||||||
VocsyEpub.open(path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VocsyEpub.locatorStream.listen((locator) async {
|
|
||||||
await saveEpubState(fileName, locator, ref);
|
|
||||||
// convert locator from string to json and save to your database to be retrieved later
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
// ignore: use_build_context_synchronously
|
|
||||||
showSnackBar(context: context, message: 'Unable to open pdf!');
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {
|
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {
|
||||||
|
@ -7,10 +7,31 @@ import 'package:openlib/state/state.dart'
|
|||||||
pdfCurrentPage,
|
pdfCurrentPage,
|
||||||
totalPdfPage,
|
totalPdfPage,
|
||||||
savePdfState,
|
savePdfState,
|
||||||
|
openPdfWithExternalAppProvider,
|
||||||
getBookPosition;
|
getBookPosition;
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
import 'package:open_file/open_file.dart';
|
||||||
import 'dart:io' show Platform;
|
import 'dart:io' show Platform;
|
||||||
|
|
||||||
|
import 'package:openlib/services/files.dart' show getFilePath;
|
||||||
|
|
||||||
|
Future<void> launchPdfViewer(
|
||||||
|
{required String fileName,
|
||||||
|
required BuildContext context,
|
||||||
|
required WidgetRef ref}) async {
|
||||||
|
bool openWithExternalApp = ref.watch(openPdfWithExternalAppProvider);
|
||||||
|
if (openWithExternalApp) {
|
||||||
|
String path = await getFilePath(fileName);
|
||||||
|
await OpenFile.open(path);
|
||||||
|
} else {
|
||||||
|
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {
|
||||||
|
return PdfView(
|
||||||
|
fileName: fileName,
|
||||||
|
);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class PdfView extends ConsumerStatefulWidget {
|
class PdfView extends ConsumerStatefulWidget {
|
||||||
const PdfView({super.key, required this.fileName});
|
const PdfView({super.key, required this.fileName});
|
||||||
|
|
||||||
|
@ -3,7 +3,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
|
|
||||||
import 'package:openlib/ui/components/page_title_widget.dart';
|
import 'package:openlib/ui/components/page_title_widget.dart';
|
||||||
import 'package:openlib/ui/about_page.dart';
|
import 'package:openlib/ui/about_page.dart';
|
||||||
import 'package:openlib/state/state.dart' show themeModeProvider, dbProvider;
|
import 'package:openlib/state/state.dart'
|
||||||
|
show
|
||||||
|
themeModeProvider,
|
||||||
|
openPdfWithExternalAppProvider,
|
||||||
|
openEpubWithExternalAppProvider,
|
||||||
|
dbProvider;
|
||||||
|
|
||||||
class SettingsPage extends ConsumerWidget {
|
class SettingsPage extends ConsumerWidget {
|
||||||
const SettingsPage({Key? key}) : super(key: key);
|
const SettingsPage({Key? key}) : super(key: key);
|
||||||
@ -41,6 +46,56 @@ class SettingsPage extends ConsumerWidget {
|
|||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
_PaddedContainer(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Open PDF with External Reader",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: Theme.of(context).colorScheme.tertiary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Switch(
|
||||||
|
// This bool value toggles the switch.
|
||||||
|
value: ref.watch(openPdfWithExternalAppProvider),
|
||||||
|
activeColor: Colors.red,
|
||||||
|
onChanged: (bool value) {
|
||||||
|
ref.read(openPdfWithExternalAppProvider.notifier).state =
|
||||||
|
value;
|
||||||
|
ref
|
||||||
|
.read(dbProvider)
|
||||||
|
.savePreference('openPdfwithExternalApp', value);
|
||||||
|
},
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
_PaddedContainer(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Open Epub with External Reader",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: Theme.of(context).colorScheme.tertiary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Switch(
|
||||||
|
// This bool value toggles the switch.
|
||||||
|
value: ref.watch(
|
||||||
|
openEpubWithExternalAppProvider,
|
||||||
|
),
|
||||||
|
activeColor: Colors.red,
|
||||||
|
onChanged: (bool value) {
|
||||||
|
ref.read(openEpubWithExternalAppProvider.notifier).state =
|
||||||
|
value;
|
||||||
|
ref
|
||||||
|
.read(dbProvider)
|
||||||
|
.savePreference('openEpubwithExternalApp', value);
|
||||||
|
},
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
_PaddedContainer(
|
_PaddedContainer(
|
||||||
onClick: () {
|
onClick: () {
|
||||||
Navigator.push(context,
|
Navigator.push(context,
|
||||||
|
48
pubspec.lock
48
pubspec.lock
@ -392,6 +392,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.2"
|
version: "1.0.2"
|
||||||
|
open_file:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: open_file
|
||||||
|
sha256: a5a32d44acb7c899987d0999e1e3cbb0a0f1adebbf41ac813ec6d2d8faa0af20
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.3.2"
|
||||||
path:
|
path:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -456,6 +464,46 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.0"
|
version: "2.2.0"
|
||||||
|
permission_handler:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: permission_handler
|
||||||
|
sha256: "63e5216aae014a72fe9579ccd027323395ce7a98271d9defa9d57320d001af81"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "10.4.3"
|
||||||
|
permission_handler_android:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: permission_handler_android
|
||||||
|
sha256: d74e77a5ecd38649905db0a7d05ef16bed42ff263b9efb73ed794317c5764ec3
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "10.3.4"
|
||||||
|
permission_handler_apple:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: permission_handler_apple
|
||||||
|
sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "9.1.4"
|
||||||
|
permission_handler_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: permission_handler_platform_interface
|
||||||
|
sha256: "7c6b1500385dd1d2ca61bb89e2488ca178e274a69144d26bbd65e33eae7c02a9"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.11.3"
|
||||||
|
permission_handler_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: permission_handler_windows
|
||||||
|
sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.3"
|
||||||
petitparser:
|
petitparser:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -45,6 +45,8 @@ dependencies:
|
|||||||
|
|
||||||
sqflite: ^2.3.0
|
sqflite: ^2.3.0
|
||||||
path_provider: ^2.0.15
|
path_provider: ^2.0.15
|
||||||
|
permission_handler: ^10.4.3
|
||||||
|
open_file: ^3.3.2
|
||||||
|
|
||||||
flutter_svg: ^2.0.7
|
flutter_svg: ^2.0.7
|
||||||
google_fonts: ^5.1.0
|
google_fonts: ^5.1.0
|
||||||
|
@ -6,9 +6,12 @@
|
|||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
|
#include <permission_handler_windows/permission_handler_windows_plugin.h>
|
||||||
#include <url_launcher_windows/url_launcher_windows.h>
|
#include <url_launcher_windows/url_launcher_windows.h>
|
||||||
|
|
||||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
|
PermissionHandlerWindowsPluginRegisterWithRegistrar(
|
||||||
|
registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
|
||||||
UrlLauncherWindowsRegisterWithRegistrar(
|
UrlLauncherWindowsRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
|
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
|
permission_handler_windows
|
||||||
url_launcher_windows
|
url_launcher_windows
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user