social_sharing_plus
social_sharing_plus
is a Flutter plugin that allows you to share content and images to various social media platforms like Facebook, Twitter, LinkedIn, WhatsApp, Reddit, and Telegram. This package provides a simple and unified interface for sharing across different apps, handling the nuances and differences of each platform.
Table of contents
Setup
social_sharing_plus
is supported on Android and iOS platforms. On the Android side, queries are made with the package names of the respective apps. This requires the addition of some Android-specific code.
Android (click to expand)
Add queries for app packages
You need to add the following queries to your app's AndroidManifest.xml file to ensure proper redirection to the respective social media apps:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<queries>
<!-- Query for Facebook -->
<package android:name="com.facebook.katana" />
<!-- Query for Twitter -->
<package android:name="com.twitter.android" />
<!-- Query for LinkedIn -->
<package android:name="com.linkedin.android" />
<!-- Query for Reddit -->
<package android:name="com.reddit.frontpage" />
<!-- Query for WhatsApp -->
<package android:name="com.whatsapp" />
<!-- Query for Telegram -->
<package android:name="org.telegram.messenger" />
</queries>
<application>
<!-- ... -->
</application>
</manifest>
Media Sharing and Media Provider
This provides a specific file provider so that it can share files with other applications. To provide this functionality, you need to create an XML folder under the android>app>src>main>res
folder and name it filepaths.xml
. Then add the following code to the filepaths.xml
file:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="cache" path="." />
<external-path name="external" path="." />
</paths>
This XML file specifies what types of files your file provider can provide. Then add a <provider>
tag in your AndroidManifest.xml file like this:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
This <provider>
tag specifies the authorization of your file provider and what file paths it provides. The android:authorities
attribute specifies the identity of your file provider, and the ${applicationId}.fileprovider
value uses your application's credentials. This ensures the security of your application while allowing other applications to access files.
iOS (click to expand)
No special configuration is needed for iOS.
dependencies:
social_sharing_plus: <latest_version>
Usage
class SharePage extends StatefulWidget {
const SharePage({super.key});
@override
State<SharePage> createState() => _SharePageState();
}
class _SharePageState extends State<SharePage> {
static const List<SocialPlatform> _platforms = SocialPlatform.values;
final ImagePicker _picker = ImagePicker();
String? _imagePath;
Future<void> _pickImage() async {
final XFile? pickedFile = await _picker.pickImage(source: ImageSource.gallery);
setState(() {
if (pickedFile != null) {
_imagePath = pickedFile.path;
}
});
}
Future<void> _share(SocialPlatform platform) async {
final String content = platform == SocialPlatform.facebook
? 'https://github.com/bedirhanssaglam'
: 'Hello ${platform.name.capitalize}! This is my GitHub profile : https://github.com/bedirhanssaglam';
try {
await SocialSharingPlus.shareToSocialMedia(
platform,
content,
image: _imagePath,
isOpenBrowser: false,
onAppNotInstalled: () {
ScaffoldMessenger.of(context)
..hideCurrentSnackBar()
..showSnackBar(SnackBar(
content: Text('${platform.name.capitalize} is not installed.'),
));
},
);
} on PlatformException catch (e) {
log(e.toString());
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Social Sharing Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _pickImage,
child: const Text('Pick Image'),
),
const SizedBox(height: 20),
..._platforms.map(
(SocialPlatform platform) => ElevatedButton(
onPressed: () => _share(platform),
child: Text('Share to ${platform.name.capitalize}'),
),
),
],
),
),
);
}
}
Properties
Properties | Required | Default | Description |
---|---|---|---|
socialPlatform | true | Platform you want to share on | |
content | true | Any text you want to share | |
image | false | The image you want to share | |
isOpenBrowser | false | true |
If the relevant application is not installed, it redirects to the link (browser) of the relevant application. |
onAppNotInstalled | false | This method works if the application is not installed and the isOpenBrowser value is set to false. (For example: Showing a Snackbar like "The application is not installed on your device."...) |
Screenshots
Dart Version
sdk: '>=2.17.0 <4.0.0'
Issues
Please file any issues, bugs, or feature requests as an issue on our GitHub page.
Contribute
If you would like to contribute to the plugin (e.g. by improving the documentation, solving a bug, or adding a cool new feature), please carefully review our contribution guide and send us your pull request.
Author
This social_sharing_plus plugin for Flutter is developed by Bedirhan Sağlam. You can contact me at bedirhansaglam270@gmail.com
License
MIT