Facebook插件(facebook开发者平台)
请看原文更详细:http://tryenough.com/flutter-plugin-share
这个活生生的例子会教你开发flutter插件,功能是封装Android和iOS端的分享到facebook和twitter的flutter接口。使用的分别是两端的系统分享功能,不需要集成facebook和twitter 的 sdk。
例子插件网址:https://pub.dartlang.org/packages/flutter_share_go#-readme-tab-
展示一下样式:
ios 中分享到facebook:
android中分享到facebook
请看原文更详细:http://tryenough.com/flutter-plugin-share
开始开发插件
步骤一:创建插件项目
这里用的Android studio创建的项目,可以直接创建flutter plugin项目,你也可以用命令创建:
flutter create –org com.example –template=plugin \\\”plugin_name\\\”
将上面的“plugin_name”换成你的插件名字就行了,我这个插件名字叫flutter_share_go,所以命令就是:
flutter create –org com.example –template=plugin flutter_share_go
这里没有支持swift和kotlin,原因是使用插件的很多项目可能并不支持,以免造成不必要的麻烦,但是你仍然可以选择支持,命令如下:
flutter create –template=plugin -i swift -a kotlin flutter_share_go
查看创建好的项目结构:
Android文件夹中:Android端原生的代码
iOS文件夹中:iOS端原生的代码
example文件:是方便测试你的插件的例子代码
lib文件:插件对原生接口的封装,也就是直接在dart代码中调用的接口
分别在Android studio和xcode中编辑Android和iOS代码
先在Android studio中编写Android部分代码
用Android studio打开项目中的android文件夹,因为此时缺少flutter库依赖,需要配置一下:
在项目根目录建立一个libs文件夹,用来存放flutter库,flutter库可以到你电脑的flutter sdk路径中寻找:
/bin/cache/artifacts/engine
在engine路径下有很多的android支持库,随便拷贝一个Android平台的库到libs文件夹下,右键flutter.jar,弹出菜单选择Add As Library…。这里不用担心,我们等下设置一下让它只是编译时使用,不会打包进来。
然后点击菜单File/Project Structure…,找到flutter_text_plugin的Dependencies中,将flutter库的Scope从Implementation改成Compile Only。
开始添加Android代码
添加如下两个文件:
PackageUtils.java 工具类
package com.doglobal.flutter_share_go;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
public class PackageUtils {
public static boolean isPkgInstalled {
if )
return false;
android.content.pm.ApplicationInfo info = null;
try {
info = context.getPackageManager.getApplicationInfo;
return info != null;
} catch {
return false;
}
}
public static void goDownloadPage {
Context app = context.getApplicationContext;
try {
Intent intent = new Intent);
intent.addFlags;
app.startActivity;
} catch {
Intent intent = new Intent);
intent.addFlags;
app.startActivity;
}
}
}
ShareHelper.java 工具类
package com.doglobal.flutter_share_go;
import android.app.Activity;
import android.content.Intent;
import android.text.TextUtils;
public class ShareHelper {
public static final String CHANNEL_FACEBOOK_PKG_NAME = \\\”com.facebook.katana\\\”;
public static final String CHANNEL_TWITTER_PKG_NAME = \\\”com.twitter.android\\\”;
public static void shareMain {
shareText;
}
public static void shareTextToChannel {
if ) {
shareText;
} else {
PackageUtils.goDownloadPage;
}
}
/**
* @param dlgTitle 选择弹框标题
* @param subject 分享主题
* @param shareText 分享内容
*/
public static void shareText {
if ) {
return;
}
String content = shareText + \\\”: \\\” + shareUrl + \\\” .\\\”;
Intent intent = new Intent;
intent.addFlags;
intent.setType;
if ) {
intent.putExtra;
}
intent.putExtra;
if ) {
intent.setPackage;
}
// 设置弹出框标题
if ) { // 自定义标题
Intent chooser = Intent.createChooser;
chooser.addFlags;
activity.startActivity;
} else { // 系统默认标题
activity.startActivity;
}
}
}
然后在FlutterShareGoPlugin.java文件中添加调用逻辑。
这个文件就是java端对dart端的调用接口。我们先来看下代码,再进行解析:
package com.doglobal.flutter_share_go;import android.app.Activity;import io.flutter.plugin.common.MethodCall;import io.flutter.plugin.common.MethodChannel;import io.flutter.plugin.common.MethodChannel.MethodCallHandler;import io.flutter.plugin.common.MethodChannel.Result;import io.flutter.plugin.common.PluginRegistry.Registrar;/** FlutterShareGoPlugin */public class FlutterShareGoPlugin implements MethodCallHandler { private Activity mActivity; //分析一 private FlutterShareGoPlugin { mActivity = context; } /** Plugin registration. */ public static void registerWith { final MethodChannel channel = new MethodChannel, \\\”flutter_share_go\\\”); channel.setMethodCallHandler)); } @Override public void onMethodCall { if ) { result.success; } else if ) { //分析二 String content = call.argument; String shareUrl = call.argument; ShareHelper.shareTextToChannel; } else if ) { String content = call.argument; String shareUrl = call.argument; ShareHelper.shareTextToChannel; } else { result.notImplemented; } }}
请看原文更详细:http://tryenough.com/flutter-plugin-share分析一我们添加一个构造方法,用来存储activity分析二在方法onMethodCall中根据dart传递过来的方法名调用java端不同的代码逻辑
至此,Android端代码就告一段落了。
iOS端开发,在xcode中开发
如图,我们在Android studio中打开一个iOS文件,在右上角会有用xcode打开的按钮,我们点击打开就可以用xcode编辑了。
打开项目添加上图中的文件:
FlutterShareGoPlugin.m文件
#import \\\”FlutterShareGoPlugin.h\\\”
#import \\\”ShareHelper.h\\\”
#import <Social/Social.h>
@interface FlutterShareGoPlugin
@property UIViewController * rootViewController;
@end
@implementation FlutterShareGoPlugin
+ registerWithRegistrar:registrar {
FlutterMethodChannel* channel = [FlutterMethodChannel
methodChannelWithName:@\\\”flutter_share_go\\\”
binaryMessenger:[registrar messenger]];
FlutterShareGoPlugin* instance = [[FlutterShareGoPlugin alloc] init];
[registrar addMethodCallDelegate:instance channel:channel];
}
– handleMethodCall:call result:result {
if {
result;
}
else if {
NSDictionary *arguments = [call arguments];
NSString * shareContent = arguments[@\\\”shareContent\\\”];
NSString * shareUrl = arguments[@\\\”shareUrl\\\”];
[ShareHelper shareToPlatformType:SLServiceTypeFacebook withContent:shareContent withShareUrl:shareUrl];
result;
}
else if {
NSDictionary *arguments = [call arguments];
NSString * shareContent = arguments[@\\\”shareContent\\\”];
NSString * shareUrl = arguments[@\\\”shareUrl\\\”];
[ShareHelper shareToPlatformType:SLServiceTypeTwitter withContent:shareContent withShareUrl:shareUrl];
result;
}
else {
result;
}
}
@end
PackageUtil.h
#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface PackageUtil : NSObject// Is intalled specific app or not+ isInstalledWithUrlScheme:urlScheme;@endNS_ASSUME_NONNULL_END
PackageUtil.m
#import \\\”PackageUtil.h\\\”
@implementation PackageUtil
+ isInstalledWithUrlScheme:urlScheme {
if {
return false;
}
return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlScheme]];
}
@end
ShareHelper.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface ShareHelper : NSObject
+shareToPlatformType:platformType withContent:content withShareUrl:url;
@end
NS_ASSUME_NONNULL_END
ShareHelper.m
#import \\\”ShareHelper.h\\\”#import <Social/Social.h>#import \\\”PackageUtil.h\\\”@implementation ShareHelper/* SOCIAL_EXTERN NSString *const SLServiceTypeTwitter NS_AVAILABLE;//Twitter SOCIAL_EXTERN NSString *const SLServiceTypeFacebook NS_AVAILABLE;//Facebook SOCIAL_EXTERN NSString *const SLServiceTypeSinaWeibo NS_AVAILABLE; SOCIAL_EXTERN NSString *const SLServiceTypeTencentWeibo NS_AVAILABLE; SOCIAL_EXTERN NSString *const SLServiceTypeLinkedIn NS_AVAILABLE; */+shareToPlatformType:platformType withContent:content withShareUrl:url{ if { NSLog; return; } if { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@\\\”itms-apps://itunes.apple.com/app/id284882215\\\”]]; NSLog; return; } if { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@\\\”itms-apps://itunes.apple.com/app/id333903271\\\”]]; NSLog; return; } // create controller for ServiceType SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:platformType]; // image // [composeVC addImage:[UIImage imageNamed:@\\\”Nameless\\\”]]; // content [composeVC setInitialText:content]; // share url [composeVC addURL:[NSURL URLWithString:url]]; // share controller if { UINavigationController *vc = [[UIApplication sharedApplication] keyWindow].rootViewController; [vc pushViewController:composeVC animated:YES]; } else { UINavigationController *vc = [[UIApplication sharedApplication] keyWindow].rootViewController; [vc presentViewController:composeVC animated:YES completion:nil]; } // callback user hanlder composeVC.completionHandler = ^{ if { } else if { } };}@end
请看原文更详细:http://tryenough.com/flutter-plugin-share
蕞后需要我们在plist文件中添加白名单,用于iOS9适配,查看是否安装了facebook和twitter:
iOS 部分代码到此也告一段落了。
添加flutter接口,供dart代码调用
打开项目中lib文件夹下的flutter_share_go文件
FlutterShareGo.dart
import \’dart:async\’;
import \’package:flutter/services.dart\’;
class FlutterShareGo {
static const MethodChannel _channel =
const MethodChannel;
static Future<String> get platformVersion async {
final String version = await _channel.invokeMethod;
return version;
}
static Future<void> shareToFBPlatform async {
assert;
assert;
final Map<String, dynamic> params = <String, dynamic> {
\’shareContent\’: shareContent,
\’shareUrl\’:shareUrl,
};
await _channel.invokeMethod;
}
static Future<void> shareToTwitterPlatform async {
assert;
assert;
final Map<String, dynamic> params = <String, dynamic> {
\’shareContent\’: shareContent,
\’shareUrl\’:shareUrl,
};
await _channel.invokeMethod;
}
}
flutter端代码就告一段落了。
测试插件:
打开项目中example文件下的main.dart:
main.dart
import \’package:flutter/material.dart\’;import \’dart:async\’;import \’package:flutter/services.dart\’;import \’package:flutter_share_go/flutter_share_go.dart\’;void main => runApp);class MyApp extends StatefulWidget { @override _MyAppState createState => _MyAppState;}class _MyAppState extends State<MyApp> { String _platformVersion = \’Unknown\’; @override void initState { super.initState; initPlatformState; } // Platform messages are asynchronous, so we initialize in an async method. Future<void> initPlatformState async { String platformVersion; // Platform messages may fail, so we use a try/catch PlatformException. try { platformVersion = await FlutterShareGo.platformVersion; } on PlatformException { platformVersion = \’Failed to get platform version.\’; } // If the widget was removed from the tree while the asynchronous platform // message was in flight, we want to discard the reply rather than calling // setState to update our non-existent appearance. if return; setState { _platformVersion = platformVersion; }); } @override Widget build { return MaterialApp, ), body: Column, RaisedButton, color: Colors.red, onPressed: { FlutterShareGo.shareToFBPlatform; }, ) ], ), ), ); }}
运行就会出现文章蕞上面的效果了。祝你顺利。
蕞后发布可以参照如下步骤:
运行命令,并解决所有出现的问题:
flutter packages pub publish –dry-run
问题解决完就可以发布了,命令:
flutter packages pub publish
请看原文更详细:http://tryenough.com/flutter-plugin-share
查看演示与获取方案
读完本篇后,可通过下方入口查看演示视频、联系客服或访问主站。