Flutter调用Android和iOS原生代码的方法示例

前言

本文主要给大家介绍了关于Flutter调用Android和iOS原生代码的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

分3个大步骤:

1.在flutter中调用原生方法

2.在Android中实现被调用的方法

3.在iOS中实现被调用的方法

在flutter中调用原生方法

场景,这里你希望调用原生方法告诉你一个bool值,这个值的意义你可以随意定,这里表示的意义是是否是中国用户。

你可以在flutter中设计好要调用的方法名称,这里就叫

isChinese

请注意:

在flutter中要调用原生代码需要通过通道传递消息,在flutter端就是MethodChannel。

所以我们这里的做法是,在flutter 端创建一个自己命名的通道:

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

这里的名字 com.test/name 你可以随便取。

讲解一下:

你可能有疑问了,我们自作主张在flutter端创建的通道,怎么就能告诉Android和iOS端到底该怎么调用呢?

你这个问题问得极好,这里啊先告诉你,等下我们还要分别在两端创建和这个通道同名的通道。

敲黑板了:

此时你知道了,我们要在三端分别有一个通道了吧,而且这三个通道是同名的,所以就能连接起来了。

不过这里还是先把flutter端的代码写完,然后我们再去分别设置android和iOS端的代码吧。go!

我们在flutter中的代码如下:

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: 创建一个我们自定义的channel。

分析2: 用channel发送调用消息到原生端,调用方法是:isChinese

好了,flutter端相信你也觉得很简单了,接下来我们来看下android端怎么搞。

在Android中实现被调用的方法

我建议你在Android studio编写Android端代码哦,因为这样有良好的代码提示和头文件引入。不过你要是有办法做到同样的效果,啥IDE俺都不在乎。

在flutter项目文件夹里的Android文件夹中有一个 MainActivity.java文件,不要告诉我你找不到啊。

我先告诉你等下就在MainActivity里注册我们的Android端插件。嘿嘿,现在先去写我们的Android端插件吧。

代码我一次贴出来了,反正也不多。

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这个方法是插件的回调,这里我们根据方法名isChinese判断调用的方法,然后实现我们的操作就行了。

分析3:这里直接返回了true,因为这只是个例子,而你应该换成你自己的逻辑哦。

我们的插件写好了,回到MainActivity.java中进行注册。

看下代码:

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端完成了。

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

接下来我们搞一下iOS端:

在iOS中实现被调用的方法

iOS中我建议你在xcode中编写代码哦。因为这样会有良好的提示。

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

用xcode打开iOS工程后,在Runner文件夹下有AppDelegate文件。

我们等下就在这里进行注册我们的插件。

那么我们先写我们的插件代码吧:

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一个德行,分为注册和方法回调两部分。但是你可能发现了这里的通道是FlutterMethodChannel,这个不用大惊小怪,flutter也是用和Android上的MethodChannel不同类名类区分这两个平台的。只是名字不同而已。

该在iOS上注册了:

在 AppDelegate.m类的如下方法添加代码就行:

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

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

恭喜你,iOS端也设置完了。

运行你的应用查看能不能调用成功吧。祝你顺利。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • Flutter中ListView 的使用示例

    这个小例子使用的是豆瓣 API 中 正在上映的电影 的开放接口,要实现的主要效果如下: JSON 数据结构 Item 结构 Item 的结构是一个 Card 包含着一个 Row 然后这个 Row 里面左边是一个 Image ,右边是一个 Column 功能实现 material 库 Json 解析 网络请求 加载菊花 要实现上面四个功能,我们首先需要在 .dart 文件中引入如下代码 import 'dart:convert'; import 'package:http/http.dart' a

  • Flutter实现底部导航栏效果

    大家最近都在讨论新鲜技术-flutter,小编也在学习中,遇到大家都遇到的问题,底部导航.下面给大家贴出底部导航的编写,主要参考了lime这个项目. 上代码 一.在main.dart文件中 定义APP的基本信息 class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new

  • Flutter质感设计之弹出菜单

    PopupMenuButton控件即弹出菜单控件,点击控件会出现菜单. import 'package:flutter/material.dart'; class MenusDemo extends StatefulWidget { @override _MenusDemoState createState() => new _MenusDemoState(); } class _MenusDemoState extends State<MenusDemo> { String _body

  • Flutter Android端启动白屏问题的解决

    问题描述 Flutter 应用在 Android 端上启动时会有一段很明显的白屏现象,白屏的时长由设备的性能决定,设备性能越差,白屏时间越长. 问题分析 其实启动白屏的问题在Android原生应用上也是一个常见问题,大致是因为从用户点击 Launcher Icon 到应用首页显示之间,Android 系统在完成应用的初始化工作,其流程如下: 在 Flutter Android 端上,白屏的问题会更加严重,因为除了 Android 应用启动耗时外,还增加了 Flutter 初始化耗时. 直到 Fl

  • Flutter进阶之实现动画效果(一)

    上一篇文章我们了解了Flutter的动画基础,这一篇文章我们就来实现一个图表的动画效果. 首先,我们需要创建一个新项目myapp,然后把main.dart的内容替换成下面的代码 import 'package:flutter/material.dart'; import 'dart:math'; void main() { runApp(new MyApp()); } class MyApp extends StatelessWidget { @override Widget build(Bui

  • flutter实现仿boss直聘功能

    Flutter是Google使用Dart语言开发的移动应用开发框架,使用一套Dart代码就能构建高性能.高保真的iOS和Android应用程序,并且在排版.图标.滚动.点击等方面实现零差异. 2年前,RN刚出来时做了个仿拉钩的demo,react-native-lagou. 这次flutter来了,想感受一下,索性用目前flutter的版本写的一个仿boss直聘应用. 时间有限,没完全仿照,去掉了一些功能,但是界面风格一致,有参考价值. github地址:flutter仿boss直聘. 感悟 与

  • Flutter调用Android和iOS原生代码的方法示例

    前言 本文主要给大家介绍了关于Flutter调用Android和iOS原生代码的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 分3个大步骤: 1.在flutter中调用原生方法 2.在Android中实现被调用的方法 3.在iOS中实现被调用的方法 在flutter中调用原生方法 场景,这里你希望调用原生方法告诉你一个bool值,这个值的意义你可以随意定,这里表示的意义是是否是中国用户. 你可以在flutter中设计好要调用的方法名称,这里就叫 isChinese 请

  • JS调用Android、Ios原生控件

    在上一篇博客(详解JS与APP原生控件交互)中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时,提高代码质量,实现两者在网页端代码的统一. 首先我们先看一下Ios调用JS的方法实现: //无参调用 function SwiftCallJs1(){} //有参调用 function SwiftCallJs2(name, message){} 紧接着我们看一下And

  • 详解Flutter 调用 Android Native 的方法

    Flutter 调用 Android Native 的方法,是通过MethodChannel的方式来实现的: 在Android端: 创建一个Class,实现FlutterPlugin和MethodCallHandler接口 重写onAttachedToEngine(),onDetachedFromEngine(),onMethodCall() onAttachedToEngine()中,根据自定义的CHANNEL_NAME创建MethodChannel, onDetachedFromEngine

  • php、java、android、ios通用的3des方法(推荐)

    php服务器,java服务器,android,ios开发兼容的3des加密解密, php <?php class DES3 { var $key = "my.oschina.net/penngo?#@"; var $iv = "01234567"; function encrypt($input){ $size = mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC); $input = $this->pk

  • Android使用ViewStub实现布局优化方法示例

    目录 实践过程 实现方式 知识点 实践过程 Hello,大家好啊,我是小空,今天带大家了解下动态加载控件ViewStub. 在平时开发中经常会遇到复杂布局,而每一个view都是会占据内存和消耗cpu的(即使再小,累计成多,一般嵌套7级以上就有明显的卡顿了),布局优化就是我们常做的任务之一,甚至是一块心病.所以我们工作中就要留意布局优化的手段,ViewStub就是其中之一. 大家应该听过merge标签,将某个布局文件的根布局写成merge的,然后对应的布局include引用,会默认不会引入merg

  • Android轻松实现多语言的方法示例

    本文介绍了Android轻松实现多语言的方法示例,分享给大家,具体如下: 1.创建多语言包 2.首先在onCreate方法中调用此方法查看上一次保存的是什么语言 public void setLanguage() { //根据读取到存放在sp里面的数据 进行设置 Configuration configuration = getResources().getConfiguration(); SharedPreferences sharedPreferences = getSharedPrefer

  • Android P实现静默安装的方法示例(官方Demo)

    Android9.0无法通过以下两种方式实现静默安装: 1.runtime执行shell cmd 2.PackageInstall 反射机制 但是Google已经给我们推荐了相关的APIDemos,所以建议大家多看看源码~ 在frameworks/base/core/java/android/content/pm/PackageInstaller.java有段关于该类的介绍: The ApiDemos project contains examples of using this API: <c

  • JavaScript检查某个function是否是原生代码的方法

    我总是经常碰到需要检查某个function是否是原生代码的情况 -- 这是功能测试中一个很重要的内容: 函数是浏览器内置支持的,还是通过第三方类库模拟的.要检测这一点,最简单的办法当然是判断函数的 toString 方法返回的值啦. JavaScript代码 判断函数是否是原生方法其实相当简单: // 判断是否原生函数 function isNative(fn) { // 示例: // alert.toString() // "function alert() { [native code] }

  • .NET/C#利用反射调用含ref或out参数的方法示例代码

    前言 使用反射,我们可以很容易地在运行时调用一些编译时无法确定的属性.方法等.在.NET中的反射可以实现从对象的外部来了解对象(或程序集)内部结构的功能,哪怕你不知道这个对象(或程序集)是个什么东西,另外.NET中的反射还可以运态创建出对象并执行它其中的方法. 反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直接创建对象,即使这个对象的类型在编译时还不知道. 反射

  • Android编程实现播放音频的方法示例

    本文实例讲述了Android编程实现播放音频的方法.分享给大家供大家参考,具体如下: 在 Android 中播放音频文件一般都是使用 MediaPlayer 类来实现的,它对多种格式的音 频文件提供了非常全面的控制方法,从而使得播放音乐的工作变得十分简单.下表列出了 MediaPlayer 类中一些较为常用的控制方法. 方法名 功能描述 setDataSource() 设置要播放的音频文件的位置. prepare() 在开始播放之前调用这个方法完成准备工作. start() 开始或继续播放音频.

随机推荐