flutter 和原生安卓的交互簡(jiǎn)單實(shí)現(xiàn)

前言:

我們?cè)谑褂胒lutter開(kāi)發(fā)的時(shí)候有時(shí)候會(huì)遇到調(diào)用flutter sdk里面的api沒(méi)有辦法實(shí)現(xiàn)的時(shí)候 我們就要用Android 或者iOS原生的代碼去實(shí)現(xiàn)(例如獲取手機(jī)的IMEI號(hào) 等等) 我們獲取到參數(shù)的值我們需要flutter跟原生進(jìn)行交互把數(shù)據(jù)回傳到flutter 代碼里面來(lái) 因?yàn)闆](méi)有iOS設(shè)備 今天我們就主要講flutter跟安卓原生的交互 廢話不多說(shuō) 我們正式開(kāi)始

效果圖

微信截圖_20200207003108.png

微信截圖_20200207003108.png

準(zhǔn)備工作

我們需要 自己安裝好flutter的環(huán)境 這個(gè)我之前的博客有講到
請(qǐng)看我之前的博客 地址 http://www.reibang.com/p/db3584019225

具體實(shí)現(xiàn)

我們?cè)趂lutter代碼里面 現(xiàn)在寫(xiě)一個(gè) Column里面包含一個(gè) FlatButton 和一個(gè)Text

   body:Column(
        children: <Widget>[
          FlatButton(
            child: Text("調(diào)用native 接口"),
            onPressed: () async{
              String  result=await platform.invokeMethod("call_native_method");
              setState(() {
                _result=result;
                print("_result ---->"+_result);
            });
            },
          ),
          Text("result is:      "+_result)
        ],
      ),

效果圖

微信截圖_20200207003212.png

flutter 端完整代碼 flutter main.dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);
  @override
  _MyHomePageState createState() {
    return _MyHomePageState();
  }
}
class _MyHomePageState extends State<MyHomePage> {
  static const String CHINAL_NAME="samples.flutter.study/call_native";
  static const platform=const MethodChannel(CHINAL_NAME);
  String  _result="";
  @override
  void initState() {
    super.initState();
  }
  @override
  void dispose() {
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
     appBar: AppBar(
       title: Text("flutter和native通信"),
     ),
      body:Column(
        children: <Widget>[
          FlatButton(
            child: Text("調(diào)用native 接口"),
            onPressed: () async{
              String  result=await platform.invokeMethod("call_native_method");
              setState(() {
                _result=result;
                print("_result ---->"+_result);
            });
            },
          ),
          Text("result is:      "+_result),
        ],
      ),
    );
  }
}

然后我們定義跟安卓原生交互的變量 CHINAL_NAME

  static const String CHINAL_NAME="samples.flutter.study/call_native";
  static const platform=const MethodChannel(CHINAL_NAME);
String  _result="";

這里的CHINAL_NAME要跟在安卓原生里面的對(duì)應(yīng)上
然后我們?cè)贔latButton 點(diǎn)擊事件里面進(jìn)行接收安卓原生的回傳的消息

  FlatButton(
            child: Text("調(diào)用native 接口"),
            onPressed: () async{
              String  result=await platform.invokeMethod("call_native_method");
              setState(() {
                _result=result;
              //這里將我們拿到回傳的值 賦值給我們自己定義的  _result  然后打
              //印到控制臺(tái)觀察 
                print("_result ---->"+_result);
            });
            },
          ),

2安卓原生部分的代碼 (java版)

package com.example.flutter_callnative;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class Main2Activity extends FlutterActivity {
    String   C_NAME="samples.flutter.study/call_native";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new MethodChannel(getFlutterView(),C_NAME).setMethodCallHandler(
                new MethodChannel.MethodCallHandler() {
                    @Override
                    public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
                        if(methodCall.method.equals("call_native_method")){
                            result.success("我是安卓原生回傳回來(lái)的數(shù)據(jù)");
                        }else{
                            result.success("I don't know what you say");
                        }
                    }
                }
        );
        GeneratedPluginRegistrant.registerWith(this);
    }
}

2安卓原生部分的代碼 (kotlin版)

package com.example.flutter_callnative

import android.os.Bundle
import io.flutter.app.FlutterActivity
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant



class MainActivity : FlutterActivity() {

    var C_NAME = "samples.flutter.study/call_native"
    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        MethodChannel(flutterView, C_NAME).setMethodCallHandler { methodCall, result ->
            if (methodCall.method == "call_native_method") {
                result.success("我是安卓原生回傳回來(lái)的數(shù)據(jù)")
            } else {
                result.success("I don't know what you say")
            }
        }
        GeneratedPluginRegistrant.registerWith(this)
    }
}

我們需要頂一個(gè) String C_NAME="samples.flutter.study/call_native";
跟flutter里面對(duì)應(yīng)的通行的 字符串名字 然后在MethodChannel 構(gòu)造方法里面?zhèn)魅? 然后在setMethodCallHandler 回調(diào)方法里面進(jìn)行處理回傳的消息

  if(methodCall.method.equals("call_native_method")){
        result.success("我是安卓原生回傳回來(lái)的數(shù)據(jù)");
                 }else{
          result.success("I don't know what you say");
         }

我們需要判斷methodCall.method.equals("call_native_method") methodCall.method是否跟flutter 里面接收的方法名字是否對(duì)應(yīng)一樣 如果已經(jīng)通過(guò) result.success("我是安卓原生回傳回來(lái)的數(shù)據(jù)"); 將我們需要回傳的數(shù)據(jù)傳回去 result.success 里面?zhèn)魅氲念愋褪莖bject 類型所有類型都支持
android 部分的代碼已經(jīng)實(shí)現(xiàn)了

然后我們回到flutter代碼里面接收情況

在flutter里么我們用過(guò)

 String  result=await platform.invokeMethod("call_native_method");

來(lái)接收
然后將result 顯示在我們的Text里面

微信截圖_20200207003108.png

當(dāng)我們點(diǎn)擊 FlatButton 就顯示回傳的數(shù)據(jù)如圖
下面我們通過(guò)日志也可以看到
微信截圖_20200207003327.png

到此我們就基本實(shí)現(xiàn)了flutter和安卓原生客戶端的簡(jiǎn)單交互
項(xiàng)目地址 :https://gitee.com/qiuyu123/flutter-call-native.git

最后總結(jié):

這個(gè)flutter 和安卓原生的交互代碼相對(duì)較少 有些寫(xiě)法也是基本是固定寫(xiě)法侧纯,交互的方法名和CHINAL_NAME 我們可以自己發(fā)揮定義但是要注意原生客戶端和flutter需要對(duì)應(yīng)上 然后就是獲取回傳回來(lái)的數(shù)據(jù)需要用到異步很魂。
實(shí)現(xiàn)起來(lái)算是比較簡(jiǎn)單.最后希望我的文章能幫助到各位解決問(wèn)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載雳灵,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者把曼。
  • 序言:七十年代末浙宜,一起剝皮案震驚了整個(gè)濱河市平夜,隨后出現(xiàn)的幾起案子线脚,更是在濱河造成了極大的恐慌那婉,老刑警劉巖板甘,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異详炬,居然都是意外死亡盐类,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)在跳,“玉大人枪萄,你說(shuō)我怎么就攤上這事∶睿” “怎么了瓷翻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)割坠。 經(jīng)常有香客問(wèn)我逻悠,道長(zhǎng),這世上最難降的妖魔是什么韭脊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任童谒,我火速辦了婚禮,結(jié)果婚禮上沪羔,老公的妹妹穿的比我還像新娘饥伊。我一直安慰自己,他們只是感情好蔫饰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布琅豆。 她就那樣靜靜地躺著,像睡著了一般篓吁。 火紅的嫁衣襯著肌膚如雪茫因。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天杖剪,我揣著相機(jī)與錄音冻押,去河邊找鬼。 笑死盛嘿,一個(gè)胖子當(dāng)著我的面吹牛洛巢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播次兆,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼稿茉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了芥炭?” 一聲冷哼從身側(cè)響起漓库,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎园蝠,沒(méi)想到半個(gè)月后渺蒿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砰琢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蘸嘶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了良瞧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陪汽。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡训唱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挚冤,到底是詐尸還是另有隱情况增,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布训挡,位于F島的核電站澳骤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏澜薄。R本人自食惡果不足惜为肮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肤京。 院中可真熱鬧颊艳,春花似錦、人聲如沸忘分。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妒峦。三九已至重斑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肯骇,已是汗流浹背窥浪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笛丙,地道東北人寒矿。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像若债,于是被迫代替她去往敵國(guó)和親符相。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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