✨ Receving share from system
This commit is contained in:
91
lib/services/sharing_intent.dart
Normal file
91
lib/services/sharing_intent.dart
Normal file
@ -0,0 +1,91 @@
|
||||
import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
||||
import 'package:island/widgets/share/share_sheet.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
|
||||
class SharingIntentService {
|
||||
static final SharingIntentService _instance =
|
||||
SharingIntentService._internal();
|
||||
factory SharingIntentService() => _instance;
|
||||
SharingIntentService._internal();
|
||||
|
||||
StreamSubscription<List<SharedMediaFile>>? _intentSub;
|
||||
BuildContext? _context;
|
||||
|
||||
/// Initialize the sharing intent service
|
||||
void initialize(BuildContext context) {
|
||||
debugPrint("SharingIntentService: Initializing with context");
|
||||
_context = context;
|
||||
_setupSharingListeners();
|
||||
}
|
||||
|
||||
/// Setup listeners for sharing intents
|
||||
void _setupSharingListeners() {
|
||||
debugPrint("SharingIntentService: Setting up sharing listeners");
|
||||
|
||||
// Listen to media sharing coming from outside the app while the app is in memory
|
||||
_intentSub = ReceiveSharingIntent.instance.getMediaStream().listen(
|
||||
(List<SharedMediaFile> value) {
|
||||
debugPrint(
|
||||
"SharingIntentService: Media stream received ${value.length} files",
|
||||
);
|
||||
if (value.isNotEmpty) {
|
||||
_handleSharedContent(value);
|
||||
}
|
||||
},
|
||||
onError: (err) {
|
||||
debugPrint("SharingIntentService: Stream error: $err");
|
||||
},
|
||||
);
|
||||
|
||||
// Get the media sharing coming from outside the app while the app is closed
|
||||
ReceiveSharingIntent.instance.getInitialMedia().then((
|
||||
List<SharedMediaFile> value,
|
||||
) {
|
||||
debugPrint(
|
||||
"SharingIntentService: Initial media received ${value.length} files",
|
||||
);
|
||||
if (value.isNotEmpty) {
|
||||
_handleSharedContent(value);
|
||||
// Tell the library that we are done processing the intent
|
||||
ReceiveSharingIntent.instance.reset();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/// Handle shared media files
|
||||
void _handleSharedContent(List<SharedMediaFile> sharedFiles) {
|
||||
if (_context == null) {
|
||||
debugPrint(
|
||||
"SharingIntentService: Context is null, cannot handle shared content",
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
debugPrint(
|
||||
"SharingIntentService: Received ${sharedFiles.length} shared files",
|
||||
);
|
||||
for (final file in sharedFiles) {
|
||||
debugPrint(
|
||||
"SharingIntentService: File path: ${file.path}, type: ${file.type}",
|
||||
);
|
||||
}
|
||||
|
||||
// Convert SharedMediaFile to XFile
|
||||
final List<XFile> files =
|
||||
sharedFiles
|
||||
.map((file) => XFile(file.path, name: file.path.split('/').last))
|
||||
.toList();
|
||||
|
||||
// Show ShareSheet with the shared files
|
||||
showShareSheet(context: _context!, content: ShareContent.files(files));
|
||||
}
|
||||
|
||||
/// Dispose of resources
|
||||
void dispose() {
|
||||
_intentSub?.cancel();
|
||||
_context = null;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user