Flutter系列 --- Flutter与原生进行通信交互

2023-05-16

Flutter系列 — Flutter与原生进行通信

项目git地址: demo地址

flutter无法直接调用系统相机、麦克风、定位、手机版本信息等,此时就需要与原生方法进行交互了。

需求

目前我们已经有了一个flutter项目(工程名称flutter_app), 但是我们要获取系统版本信息

方案

我们需要定义一个flutter插件获取系统信息。
这里开发工具使用Android Studio 点击 File --> New --> New Flutter Project

- 选择 Flutter Plugin

在这里插入图片描述在这里插入图片描述在这里插入图片描述
点击Finish会自动创建完成.

找到deviceInfo中的lib/deviceinfo.dart,
定义方法渠道, 渠道名为deviceinfo, (渠道名必须和原生定义的一模一样)

import 'dart:async';

import 'package:flutter/services.dart';

class Deviceinfo {
  // 定义方法渠道, deviceinfo必须和原生定义的一模一样.		
  static const MethodChannel _channel =
      const MethodChannel('deviceinfo');
  // 获取系统版本号	
  static Future<String> get systemVersion async {
    final String version = await _channel.invokeMethod('getSystemVersion');
    return version;
  }
}

MethodChannel是和原生建立的方法通道, 通过MethodChannel和原生相互通信, invokeMethod

编辑iOS代码

找到以下路径代码
.../flutter_app/plugin/device_info/ios/Classes/DeviceinfoPlugin.m

判断flutter传过来的方法名, 回调给flutter层

#import "DeviceinfoPlugin.h"

@implementation DeviceinfoPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
  FlutterMethodChannel* channel = [FlutterMethodChannel
      methodChannelWithName:@"deviceinfo"
            binaryMessenger:[registrar messenger]];
  DeviceinfoPlugin* instance = [[DeviceinfoPlugin alloc] init];
  [registrar addMethodCallDelegate:instance channel:channel];
}

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
  // 判断flutter传过来的方法名, 回调给flutter层
  if ([@"getSystemVersion" isEqualToString:call.method]) {
    result([[UIDevice currentDevice] systemVersion]);
  } else {
    result(FlutterMethodNotImplemented);
  }
}

@end

编辑Android代码

找到以下路径代码

.../flutter_app/plugin/device_info/android/src/main/java/com/example/deviceinfo/DeviceinfoPlugin.java
package com.example.deviceinfo;

import androidx.annotation.NonNull;

import io.flutter.embedding.engine.plugins.FlutterPlugin;
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;

/** DeviceinfoPlugin */
public class DeviceinfoPlugin implements FlutterPlugin, MethodCallHandler {
  /// The MethodChannel that will the communication between Flutter and native Android
  ///
  /// This local reference serves to register the plugin with the Flutter Engine and unregister it
  /// when the Flutter Engine is detached from the Activity
  private MethodChannel channel;

  @Override
  public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
    channel = new MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "deviceinfo");
    channel.setMethodCallHandler(this);
  }

  public static void registerWith(Registrar registrar) {
    final MethodChannel channel = new MethodChannel(registrar.messenger(), "deviceinfo");
    channel.setMethodCallHandler(new DeviceinfoPlugin());
  }

  @Override
  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
    if (call.method.equals("getSystemVersion")) {
      result.success(android.os.Build.VERSION.RELEASE);
    } else {
      result.notImplemented();
    }
  }

  @Override
  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
    channel.setMethodCallHandler(null);
  }
}

使用device_info插件

找到项目中的pubspec.yaml, 引入deviceinfo, 并在终端执行
$ flutter pub get

dependencies:
  flutter:
    sdk: flutter
  deviceinfo:
    path: plugin/device_info

在flutter项目中使用

  1. 导入: import ‘package:deviceinfo/deviceinfo.dart’;
  2. 调用: String version = await Deviceinfo.systemVersion;
import 'package:flutter/material.dart';
import 'package:deviceinfo/deviceinfo.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {



  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  String _systemVersion = '';


  @override
  void initState() {
    initSysVersion();
    super.initState();
  }

  initSysVersion() async {
    String version =  await Deviceinfo.systemVersion;
    setState(() {
      _systemVersion = version;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(

        title: Text(widget.title),
      ),
      body: Center(
          child: Text('系统版本: $_systemVersion'),
      ),
    );
  }
}

iOS效果:

在这里插入图片描述

安卓效果

在这里插入图片描述

项目git地址: demo地址

喜欢就给个star吧

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter系列 --- Flutter与原生进行通信交互 的相关文章

随机推荐

  • 这份软件测试中的 43 个功能测试点,看看你会吗?

    功能测试就是对产品的各功能进行 验证 xff0c 根据功能测试 用例 xff0c 逐项测试 xff0c 检查产品是否达到用户要求的功能 针对 web 系统的常用测试方法如下 xff1a 1 页面链接检查 xff1a 每一个链接是否都有对应的
  • 还在发愁项目去哪找?软件测试企业级Web自动化测试实战项目

    今天给大家分享一个简单易操作的实战项目 xff08 已开源 xff09 项目名称 ET开源商场系统 项目描述 ETshop是一个电子商务B2C电商平台系统 xff0c 功能强大 xff0c 安全便捷 适合企业及个人快速构建个性化网上商城 包
  • 【面经】2023年软件测试面试题大全(持续更新)附答案

    面试的准备跟笔试的准备是不一样的 xff0c 笔试的准备的话 xff0c 可以去刷题 xff0c 面试的话 xff0c 专业的面试官一般首先都会根据你简历上写的内容去提问 xff0c 都问完之后 xff0c 最后可能再会问一下简历之外的 x
  • 今天面了一个来阿里要求月薪23K,明显感觉他背了很多面试题...

    最近有朋友去阿里面试 xff0c 面试前后进行了20天左右 xff0c 包含4轮电话面试 1轮笔试 1轮主管视频面试 1轮hr视频面试 据他所说 xff0c 80 的人都会栽在第一轮面试 xff0c 要不是他面试前做足准备 xff0c 估计
  • svn: E230001: Server SSL certificate verification failed:certificate issued for a different hostname

    svn E230001 Server SSL certificate verification failed certificate issued for a different hostname issuer is nottrusted
  • linux系统中的用户管理

    linux系统中的用户管理 1 用户及用户组存在的意义1 1用户存在的意义1 2用户组存在意义2 用户及用户组在系统中的存在方式3 用户切换3 1用户查看3 2用户切换4 用户涉及到的系统配置文件5 用户和用户组建立及删除6 用户和用户组的
  • ddns的搭建(动态域名解析DDNS)

    ddns的搭建 服务主机客户端dhcp分配ip失败 动态域名解析 xff08 Dynamic DNS xff0c 简称DDNS xff09 是把互联网域 服务原理 服务原理 名指向可变IP地址的系统 DNS只是提供了域名和IP地址之间的静态
  • 谷歌浏览器去除广告--广告终结者

    每次使用谷歌浏览器查阅一些资料的时候 xff0c 总是会弹出一大堆广告窗口 xff0c 影响阅读体验 现在找到一种方法可以屏蔽网页上浮动的 xff0c 弹框的 xff0c 渐变的广告 1 下载离线插件安装包 Advertising Term
  • DM数据库Linux服务器启动图形化工具

    背景 DM数据库客户端工具位于 DM 安装目录的 tool 目录下 在Linux系统中使用这些客户端工具需要开启图形化功能 xff0c 本文介绍开启Linux图形化的操作步骤 开启图形化 root用户允许其他用户连接 xff0c 执行 sp
  • MySQL基础概述

    1 MySQL列类型 xff1a 带符号 无符号整数 xff0c 1 2 3 4 8字节长 xff0c FLOAT xff0c DOUBLE xff0c CHAR xff0c VARCHAR xff0c TEXT xff0c BLOB xf
  • Ubuntu11.04无线网络已禁用或设备未就绪

    以前在Win7下安装Ubuntu的时候 xff0c Ubuntu能够正常的连接到无线网 xff0c 但是在新买的笔记本上安装完Ubuntu11 04后 xff0c 出现了无线网络已经禁用的情况 xff0c 起初我以为是无线网络开关未开启 x
  • 第11章 远程联机服务器SSH/XDMCP/VNC/RDP

    1 用例 远程联机服务器 xff0c 提供用户远程透过文字或图形接口登入系统 2 静态 2 1 sshd 该服务提供远程联机 xff0c 并且数据加密 查看是否启动命令 service sshd start 设置系统启动是开启sshd服务命
  • ubuntu下找不到openssl/ssl.h

    编译代码 xff0c 总提示找不到openssl ssl h文件 xff0c 怀疑没有安装ssl 于是 sudo apt get install openssl 之后再编译 xff0c 还是提示同样的问题 于是查找 usr local in
  • 基于Docker的RStudio-server构建

    docker rstudio server Dockerfile for RStudio Server Docker image Pull the image from Docker Hub span class token functio
  • 回收站的路径 (CentOS6、Fedora10)

    刚开始装Linux系统的时候在root用户下向其他用户拷贝过一些文件 xff0c 后面就删除了 但在普通用户下 xff0c 没有删除的权限 xff0c 想修改权限后删除又找不到回收站的路径 xff08 刚开始还不知道搜索回收站的路径 xff
  • dmPython

    dmPython 达梦为适配 python 开发出 dmPython 接口 xff0c 在使用时还需要需要配置 DPI 运行环境 1 连接方式 dmPython提供两种连接方式 xff0c 不仅支持 key 61 value 形式传参连接
  • iOS 手动实现KVO / iOS KVO底层原理

    手动实现KVO KVO底层原理 git demo地址 看图 首先说一下Apple KVO的底层实现吧 内部实现原理 KVO是基于runtime机制实现的 xff0c 运用了一个isa swizzling技术 isa swizzling就是类
  • Flutter系列 - 引入本地图片

    Flutter系列 引入本地图片 1 大致文件结构 images myIcon png myIcon2 png lib pubspec yaml 2 步骤 在flutter中引入本地图片 我们先在项目根目录建立一个images文件夹 把本地
  • 如何写出优美的 C 代码 面向对象的 C

    基础知识 结构体 除了提供基本数据类型外 xff0c C 语言还提供给用户自己定制数据类型的能力 xff0c 那就是结构体 xff0c 在 C 语言中 xff0c 你可以用结构体来表示任何实体 结构体正是面向对象语言中的类的概念的雏形 xf
  • Flutter系列 --- Flutter与原生进行通信交互

    Flutter系列 Flutter与原生进行通信 项目git地址 demo地址 flutter无法直接调用系统相机 麦克风 定位 手机版本信息等 xff0c 此时就需要与原生方法进行交互了 需求 目前我们已经有了一个flutter项目 工程