Flutter 如何調(diào)用Android和iOS原生代碼

分3個(gè)大步驟:

1.在flutter中調(diào)用原生方法
2.在Android中實(shí)現(xiàn)被調(diào)用的方法
3.在iOS中實(shí)現(xiàn)被調(diào)用的方法

在flutter中調(diào)用原生方法

場(chǎng)景两入,這里你希望調(diào)用原生方法告訴你一個(gè)bool值萝快,這個(gè)值的意義你可以隨意定檩奠,這里表示的意義是是否是中國(guó)用戶劈狐。

你可以在flutter中設(shè)計(jì)好要調(diào)用的方法名稱饰躲,這里就叫

isChinese

請(qǐng)注意:

在flutter中要調(diào)用原生代碼需要通過(guò)通道傳遞消息铜涉,在flutter端就是MethodChannel纽谒。

所以我們這里的做法是蜘拉,在flutter 端創(chuàng)建一個(gè)自己命名的通道:

const platform = const MethodChannel("com.test/name");

這里的名字 com.test/name 你可以隨便取萨西。

講解一下:

你可能有疑問(wèn)了,我們自作主張?jiān)趂lutter端創(chuàng)建的通道旭旭,怎么就能告訴Android和iOS端到底該怎么調(diào)用呢谎脯?


你這個(gè)問(wèn)題問(wèn)得極好,這里啊先告訴你持寄,等下我們還要分別在兩端創(chuàng)建和這個(gè)通道同名的通道源梭。

敲黑板了:

此時(shí)你知道了,我們要在三端分別有一個(gè)通道了吧稍味,而且這三個(gè)通道是同名的废麻,所以就能連接起來(lái)了。


不過(guò)這里還是先把flutter端的代碼寫(xiě)完模庐,然后我們?cè)偃シ謩e設(shè)置android和iOS端的代碼吧烛愧。go!

請(qǐng)大家支持我的網(wǎng)站:http://tryenough.com/flutter-tonative

我們?cè)趂lutter中的代碼如下:

Future<bool> isEuropeUser() async {
    // Native channel
    const platform = const MethodChannel("com.test/name"); //分析1
    bool result = false;
    try {
      result = await platform.invokeMethod("isChinese"); //分析2
    } on PlatformException catch (e) {
      print(e.toString());
    }
    return result;
  }

還是分析一下:

分析1: 創(chuàng)建一個(gè)我們自定義的channel掂碱。
分析2: 用channel發(fā)送調(diào)用消息到原生端怜姿,調(diào)用方法是:isChinese


好了,flutter端相信你也覺(jué)得很簡(jiǎn)單了顶吮,接下來(lái)我們來(lái)看下android端怎么搞社牲。

在Android中實(shí)現(xiàn)被調(diào)用的方法

我建議你在Android studio編寫(xiě)Android端代碼哦,因?yàn)檫@樣有良好的代碼提示和頭文件引入悴了。不過(guò)你要是有辦法做到同樣的效果搏恤,啥IDE俺都不在乎。

在flutter項(xiàng)目文件夾里的Android文件夾中有一個(gè) MainActivity.java文件湃交,不要告訴我你找不到啊熟空。

我先告訴你等下就在MainActivity里注冊(cè)我們的Android端插件。嘿嘿搞莺,現(xiàn)在先去寫(xiě)我們的Android端插件吧息罗。

代碼我一次貼出來(lái)了,反正也不多才沧。

public class FlutterNativePlugin implements MethodChannel.MethodCallHandler {

    public static String CHANNEL = "com.test/name";  // 分析1

    static MethodChannel channel;

    private Activity activity;

    private FlutterNativePlugin(Activity activity) {
        this.activity = activity;
    }

    public static void registerWith(PluginRegistry.Registrar registrar) {
        channel = new MethodChannel(registrar.messenger(), CHANNEL);
        FlutterNativePlugin instance = new FlutterNativePlugin(registrar.activity());
        channel.setMethodCallHandler(instance);
    }

    @Override
    public void onMethodCall(MethodCall methodCall,  MethodChannel.Result result) {  // 分析 2
        if (methodCall.method.equals("isChinese")) {
            boolean isChinese = true;  
            result.success(isEuropean);  // 分析3
        }
        else {
            result.notImplemented();
        }
    }
}

分析:

分析1: 注意這里的插件名字要和flutter中的一樣

分析2:onMethodCall這個(gè)方法是插件的回調(diào)迈喉,這里我們根據(jù)方法名isChinese判斷調(diào)用的方法绍刮,然后實(shí)現(xiàn)我們的操作就行了。

分析3:這里直接返回了true挨摸,因?yàn)檫@只是個(gè)例子孩革,而你應(yīng)該換成你自己的邏輯哦。

我們的插件寫(xiě)好了得运,回到MainActivity.java中進(jìn)行注冊(cè)膝蜈。

看下代碼:

public class MainActivity extends FlutterActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
    registerCustomPlugin(this);
  }

  private void registerCustomPlugin(PluginRegistry registrar) {
    FlutterNativePlugin.registerWith(registrar.registrarFor(FlutterNativePlugin.CHANNEL));
  }
}

恭喜恭喜,Android端完成了熔掺。


//////////////////////////////////////////////////////////////////////////////////////////////////////////


接下來(lái)我們搞一下iOS端:

請(qǐng)大家支持我的網(wǎng)站:http://tryenough.com/flutter-tonative

在iOS中實(shí)現(xiàn)被調(diào)用的方法

iOS中我建議你在xcode中編寫(xiě)代碼哦饱搏。因?yàn)檫@樣會(huì)有良好的提示。

我先告訴你要改那些文件:

用xcode打開(kāi)iOS工程后置逻,在Runner文件夾下有AppDelegate文件推沸。

我們等下就在這里進(jìn)行注冊(cè)我們的插件。

那么我們先寫(xiě)我們的插件代碼吧:

FlutterNativePlugin.h


#import <Foundation/Foundation.h>
#import <Flutter/Flutter.h>

NS_ASSUME_NONNULL_BEGIN

@interface FlutterNativePlugin : NSObject <FlutterPlugin>

@end

NS_ASSUME_NONNULL_END

FlutterNativePlugin.m

#import "FlutterNativePlugin.h"
#import "CountryUtils.h"

@implementation FlutterNativePlugin

+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
    FlutterMethodChannel* channel =
    [FlutterMethodChannel methodChannelWithName:@"com.test/name"
                                binaryMessenger:[registrar messenger]];
    FlutterNativePlugin* instance = [[FlutterNativePlugin alloc] init];
    [registrar addMethodCallDelegate:instance channel:channel];
}

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
    if ([@"isEuropeUser" isEqualToString:call.method]) {
        result([NSNumber numberWithBool:YES]);
    } else {
        result(FlutterMethodNotImplemented);
    }
}
@end

分析:

這里也是和android一個(gè)德行诽偷,分為注冊(cè)和方法回調(diào)兩部分坤学。但是你可能發(fā)現(xiàn)了這里的通道是FlutterMethodChannel,這個(gè)不用大驚小怪报慕,flutter也是用和Android上的MethodChannel不同類名類區(qū)分這兩個(gè)平臺(tái)的深浮。只是名字不同而已。

該在iOS上注冊(cè)了:

AppDelegate.m類的如下方法添加代碼就行:

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [GeneratedPluginRegistrant registerWithRegistry:self];
    [FlutterNativePlugin registerWithRegistrar: [self registrarForPlugin:@"FlutterNativePlugin"]];
    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

///////////////////////////////////////////////////////////////////////////////////


恭喜你眠冈,iOS端也設(shè)置完了飞苇。

運(yùn)行你的應(yīng)用查看能不能調(diào)用成功吧。祝你順利蜗顽。

最后希望大家多多支持我的網(wǎng)站布卡。因?yàn)槲业奈恼乱恢睍?huì)在我的網(wǎng)站上更新,而這里就不一定更新了雇盖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忿等,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子崔挖,更是在濱河造成了極大的恐慌贸街,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狸相,死亡現(xiàn)場(chǎng)離奇詭異薛匪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脓鹃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門逸尖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事娇跟⊙页荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵苞俘,是天一觀的道長(zhǎng)纯衍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)苗胀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任瓦堵,我火速辦了婚禮基协,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菇用。我一直安慰自己澜驮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布惋鸥。 她就那樣靜靜地躺著杂穷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卦绣。 梳的紋絲不亂的頭發(fā)上耐量,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音滤港,去河邊找鬼廊蜒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛溅漾,可吹牛的內(nèi)容都是我干的山叮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼添履,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屁倔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起暮胧,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锐借,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后叔壤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瞎饲,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年炼绘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗅战。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驮捍,靈堂內(nèi)的尸體忽然破棺而出疟呐,到底是詐尸還是另有隱情,我是刑警寧澤东且,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布启具,位于F島的核電站,受9級(jí)特大地震影響珊泳,放射性物質(zhì)發(fā)生泄漏鲁冯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一色查、第九天 我趴在偏房一處隱蔽的房頂上張望薯演。 院中可真熱鬧,春花似錦秧了、人聲如沸跨扮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衡创。三九已至,卻和暖如春晶通,著一層夾襖步出監(jiān)牢的瞬間璃氢,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工狮辽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拔莱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓隘竭,卻偏偏與公主長(zhǎng)得像塘秦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子动看,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 我們都知道Flutter開(kāi)發(fā)的app是可以同時(shí)在iOS和Android系統(tǒng)上運(yùn)行的尊剔。顯然Flutter需要有...
    HowHardCanItBe閱讀 20,600評(píng)論 12 27
  • 目錄 一、Flutter 為何使用Dart開(kāi)發(fā)語(yǔ)言二菱皆、Flutter的UI系統(tǒng)1.特點(diǎn)2.架構(gòu)簡(jiǎn)介2.1 Flut...
    十拿九穩(wěn)啦閱讀 3,662評(píng)論 3 28
  • 我們的一生會(huì)遇到很多遺憾 因?yàn)槲覀兌继煨∫捕嘉⒉蛔愕莱鹎幔髞?lái)的我們都會(huì)明白 并不是兩情相悅就能共度余生京痢,時(shí)機(jī)才是我...
    FelixNote閱讀 313評(píng)論 0 0
  • 雨 淋濕了頭發(fā) 淋濕了衣服 淋濕了心 風(fēng) 吹落了花 吹散了香 吹開(kāi)了情思 纏綿哀怨不由己 境由心生不由人 背起行囊...
    美食美客閱讀 210評(píng)論 0 1