一周掌握Flutter开发--9. 与原生交互(上)
文章目录
- 9. 与原生交互
- 核心场景
- 9.1 调用平台功能:`MethodChannel`
- 9.1.1 Flutter 端实现
- 9.1.2 Android 端实现
- 9.1.3 iOS 端实现
- 9.1.4 使用场景
- 9.2 使用社区插件
- 9.2.1 常用插件
- 9.2.2 插件的优势
- 总结
9. 与原生交互
Flutter 提供了强大的跨平台开发能力,但在某些场景下,可能需要调用平台特定的功能(如相机、GPS、传感器等)。Flutter 通过 平台通道(Platform Channel) 实现与原生代码的交互。以下是详细讲解。
核心场景
9.1 调用平台功能:MethodChannel
MethodChannel
是 Flutter 与原生代码(Android/iOS)通信的核心机制。通过 MethodChannel
,Flutter 可以调用原生代码的功能,并接收返回结果。
9.1.1 Flutter 端实现
-
创建
MethodChannel
:import 'package:flutter/services.dart';class NativeBridge {static const platform = MethodChannel('com.example.app/native');// 调用原生方法static Future<String> getPlatformVersion() async {try {final String result = await platform.invokeMethod('getPlatformVersion');return result;} on PlatformException catch (e) {return 'Failed to get platform version: ${e.message}';}} }
-
调用原生方法:
void fetchPlatformVersion() async {String platformVersion = await NativeBridge.getPlatformVersion();print('Platform Version: $platformVersion'); }
9.1.2 Android 端实现
- 在
MainActivity
中实现MethodChannel
:package com.example.app;import androidx.annotation.NonNull; import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.plugin.common.MethodChannel;public class MainActivity extends FlutterActivity {private static final String CHANNEL = "com.example.app/native";@Overridepublic void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {super.configureFlutterEngine(flutterEngine);new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL).setMethodCallHandler((call, result) -> {if (call.method.equals("getPlatformVersion")) {String version = android.os.Build.VERSION.RELEASE;result.success(version);} else {result.notImplemented();}});} }
9.1.3 iOS 端实现
- 在
AppDelegate
中实现MethodChannel
:#import "AppDelegate.h" #import <Flutter/Flutter.h>@implementation AppDelegate- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions {FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;FlutterMethodChannel* channel = [FlutterMethodChannelmethodChannelWithName:@"com.example.app/native"binaryMessenger:controller.binaryMessenger];[channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {if ([@"getPlatformVersion" isEqualToString:call.method]) {NSString *version = [[UIDevice currentDevice] systemVersion];result(version);} else {result(FlutterMethodNotImplemented);}}];return [super application:application didFinishLaunchingWithOptions:launchOptions]; }@end
9.1.4 使用场景
- 调用平台特定的 API(如获取设备信息、访问传感器)。
- 实现 Flutter 不支持的功能(如自定义硬件交互)。
9.2 使用社区插件
Flutter 社区提供了大量插件,封装了常见的平台功能(如相机、GPS、文件存储等),开发者可以直接使用这些插件,而无需手动实现原生代码。
9.2.1 常用插件
-
camera
:访问设备相机。- 安装:
dependencies:camera: ^0.10.0
- 使用示例:
import 'package:camera/camera.dart';class CameraScreen extends StatefulWidget { _CameraScreenState createState() => _CameraScreenState(); }class _CameraScreenState extends State<CameraScreen> {CameraController? _controller;void initState() {super.initState();_initializeCamera();}Future<void> _initializeCamera() async {final cameras = await availableCameras();final camera = cameras.first;_controller = CameraController(camera,ResolutionPreset.medium,);await _controller!.initialize();if (!mounted) return;setState(() {});} Widget build(BuildContext context) {if (_controller == null || !_controller!.value.isInitialized) {return Center(child: CircularProgressIndicator());}return CameraPreview(_controller!);}void dispose() {_controller?.dispose();super.dispose();} }
- 安装:
-
geolocator
:获取设备位置。- 安装:
dependencies:geolocator: ^9.0.0
- 使用示例:
import 'package:geolocator/geolocator.dart';void getLocation() async {bool serviceEnabled = await Geolocator.isLocationServiceEnabled();if (!serviceEnabled) {return; // 位置服务未启用}LocationPermission permission = await Geolocator.checkPermission();if (permission == LocationPermission.denied) {permission = await Geolocator.requestPermission();if (permission == LocationPermission.denied) {return; // 权限被拒绝}}Position position = await Geolocator.getCurrentPosition();print('Latitude: ${position.latitude}, Longitude: ${position.longitude}'); }
- 安装:
9.2.2 插件的优势
- 快速集成:无需编写原生代码,直接使用插件提供的 API。
- 社区支持:插件通常由社区维护,文档和示例丰富。
- 跨平台兼容:插件通常支持 Android 和 iOS,减少开发工作量。
总结
MethodChannel
:用于 Flutter 与原生代码的通信,适合自定义功能。- 社区插件:如
camera
和geolocator
,封装了常见的平台功能,适合快速集成。
在下一部分中,我们将深入探讨如何优化原生交互的性能,以及如何处理复杂的原生交互场景。
结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!
相关文章:
一周掌握Flutter开发--9. 与原生交互(上)
文章目录 9. 与原生交互核心场景9.1 调用平台功能:MethodChannel9.1.1 Flutter 端实现9.1.2 Android 端实现9.1.3 iOS 端实现9.1.4 使用场景 9.2 使用社区插件9.2.1 常用插件9.2.2 插件的优势 总结 9. 与原生交互 Flutter 提供了强大的跨平台开发能力,但…...
DeepSeek-V3-0324对比OpenAI GPT-4o和Gemini 2.5 Pro
以下是DeepSeek-V3-0324、OpenAI GPT-4o与谷歌Gemini 2.5 Pro模型的更新点及优化对比总结: 1. DeepSeek-V3-0324 开源地址:https://huggingface.co/deepseek-ai/DeepSeek-V3-0324 核心更新与优化 性能提升: 采用6850亿参数MoE架构ÿ…...
【AI论文】LEGO拼图:大型语言模型在多步骤空间推理方面的表现如何?
摘要:多步骤空间推理涉及跨多个顺序步骤理解和推理空间关系,这对于解决复杂的现实世界应用至关重要,如机器人操作、自主导航和自动化装配。为了评估当前多模态大型语言模型(MLLMs)在获取这一基本能力方面的表现&#x…...
【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV5模型部署
【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…...
vcpkg安装指定版本的库
一.vcpkg安装 使用git将vcpkg源码克隆到本地制定目录(D:\vcpkg),并初始化 git clone https://github.com/microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh # Linux/macOS .\bootstrap-vcpkg.bat # Windows 如下图: 二.安…...
springboot 四层架构之间的关系整理笔记五
问题:service 和 多个serviceimpl 分层之间的逻辑关系? 好的!用班级活动的例子继续讲,假设班长(Service接口)要管理多种任务,而不同的班委(ServiceImpl实现类)负责不同场…...
记录一次交易耗时有毛刺TDSQL数据库排查过程
信息同步非常重要,解决问题前,务必从应用获取实例信息、sql关键字、问题时间段、问题描述。 处理步骤: 1、登陆赤兔,打开实例监控信息,检查CPU、内存、IO、缓冲命中率、proxy汇总请求量耗时情况,初步判断…...
爱普生晶体单元FC2012AN在5G RedCap中的应用
在 5G 技术向物联网领域深度渗透的今天,RedCap(5G 轻量化)作为衔接中高速物联网场景的关键技术,正加速推动工业、医疗、可穿戴等领域的智能化升级。爱普生 FC2012AN 低 ESR 晶体单元凭借其突破性的小尺寸、低功耗与高稳定性设计&a…...
Linux: 网络,arp的数量为什么会对交换机/路由器有性能的影响
这个问题也是非常普遍的问题。比如最近比较火的一个OVS相关的问题: ARP request packets put high pressure on the pinctrl thread in ovn-controller 另一个在工作种也遇到了相似的问题,当一个网络里发了同时发了小一百个GARP之后,路由器的gateway就会有ARP处理延迟。 A…...
javaWeb vue的简单语法
一、简介 两大核心优势: 声明式渲染:Vue 基于标准 HTML 拓展了一套模板语法,使得我们可以声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。 响应性:Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 D…...
Android 中隐藏标题栏和状态栏的方法
在Android开发中,隐藏标题栏和状态栏是实现全屏显示的常见需求。 一、隐藏标题栏 1、通过代码隐藏 对于继承自 AppCompatActivity 的 Activty,可在 onCreate() 方法中调用supportRequestWindowFeature 或 getSupportActionBar 方法来隐藏标题栏。 ove…...
Tof 深度相机原理
深度相机(TOF)的工作原理_tof相机原理-CSDN博客 深度剖析 ToF 技术:原理、优劣、数据纠错与工业应用全解析_tof技术-CSDN博客 飞行时间技术TOF_tof计算公式-CSDN博客 深度相机(二)——飞行时间(TOF)_飞行时间技术-C…...
boost.asio
as(async):异步 同步io: reactor (非阻塞)(需要注册一次,在等待消息时可以干别的事) 阻塞io网络模型 接口:read\accept\connect\write 接口返回时,io完成 异步…...
Python 装饰器(Decorators)
什么是装饰器? 装饰器(Decorator)本质上是一个 修改其他函数功能的函数。它的核心思想是:不修改原函数代码,动态添加新功能。比如: 记录函数执行时间 检查用户权限 缓存计算结果 自动重试失败操作 理解…...
django orm的优缺点
Django ORM(对象关系映射)是 Django 框架的核心组件之一,它通过将数据库表映射为 Python 类,简化了数据库操作。以下是其优缺点总结: 优点 开发效率高 用 Python 类定义数据模型,无需手写 SQL,…...
国产RISC-V车规芯片当前现状分析——从市场与技术角度出发
摘要 随着汽车产业的智能化、电动化转型加速,车规级芯片的战略地位日益凸显。RISC-V指令集凭借其开源、灵活、低功耗等优势,成为国产车规芯片的重要发展方向。本文从市场与技术两个维度出发,深入分析国产RISC-V车规芯片的现状。通过梳理国内…...
不落因果与不昧因果
在佛教浩瀚的哲学体系中,“因果”是贯穿修行始终的核心命题。而“不落因果”与“不昧因果”这对看似矛盾的概念,恰似明镜的两面,映照出修行者对因果法则的不同认知层次。二者虽仅一字之差,却如天堑般分隔了迷悟两岸,其…...
《论语别裁》第02章 为政(08) 诗的伟大
孔子说我整理诗三百篇的宗旨在什么地方?“一言以蔽之”——一句话,“思无邪”。人不能没有思想,只要是思想不走歪曲的路,引导走上正路就好,譬如男女之爱。如果作学问的人,男女之爱都不能要,世界…...
在学校图书馆知识库中进行论文检索报告生成
首先登录信息门户—>科研服务—>机构知识库 在成果认领页面,查看自己的成果情况。如果发现自己的有些成果未被录入,可以发邮件给管理员。 最后,进入成果管理,选择需要的成果进行检索报告的生成...
《寒门枭雄传》章回体拟目与故事设计
《寒门枭雄传》章回体拟目与故事设计 主题:寒门逆袭的制度性困境与个人成长的撕裂性代价 第一回 贩履郎寒冬逢逼债 落魄汉雪夜定从戎 地点:京口草鞋摊→北府军营 人物:刘裕、刁逵(士族豪强)、刘母 故事: …...
头歌 | Linux之用户高级管理
若未实现预期结果, 可私信我帮你解答 2025-3-28 第1关:创建/删除用户组 > /data/workspace/myshixun/case1/evaluating.sh # 写入新内容 echo "echo 创建newGroup用户组成功 创建newGroupID用户组成功 设置newGroupID用户组ID成功 删除oldGroup用户组成功…...
常用的测试用例
登录、添加、删除、查询模块是我们经常遇到的,这些模块的测试点该如何考虑 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求,密码不符合要求(格式上的要求) ④ 密码符合要求…...
数据结构与算法——顺序表的实现以及增、插、删、查、印、毁
文章目录 一、前言二、顺序表的概念与结构2.1顺序表的概念2.2顺序表的结构 三、顺序表的分类3.1静态顺序表3.1.1静态顺序表的弊端 3.2动态顺序表3.2.1动态顺序表的相对利弊3.2.2动态顺序表的增容方式 四、顺序表的增、插、删、查、印、毁4.1 顺序表的增容4.2顺序表的尾插和头插…...
环境 tensorflow ERROR: No matching distribution found for ai-edge-litert
提示:环境搭建 文章目录 前言多依赖安装 前言 提示:版本 之前文章 condajupyter 环境搭建 PyTorch 2.6 cpu 环境搭建 系统 :ubuntu 22.0 python :3.8 ERROR: No matching distribution found for ai-edge-litert PyTorch: sta…...
基于深度强化学习的智能机器人路径规划技术研究
在人工智能与机器人技术飞速发展的今天,智能机器人在工业、服务、物流等领域的应用日益广泛。路径规划作为智能机器人运动的核心技术之一,直接影响机器人的工作效率和安全性。近年来,深度强化学习(Deep Reinforcement Learning, D…...
【ManiSkill】环境success条件和reward函数学习笔记
1. “PickCube-v1” info["success"]:用于指示任务是否成功完成 布尔型张量,在环境的evaluate()方法中计算并返回: "success": is_obj_placed & is_robot_static这确保了机器人不仅能将物体准确放置在目标位置&am…...
畅捷通T+与吉客云数据集成案例解析
畅捷通T与吉客云的高效数据集成案例分享 在企业信息化系统中,数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将聚焦于一个具体的系统对接集成案例:如何将畅捷通T中的采购入库单(红字)数据无缝集成到吉客云中࿰…...
Vue 项目中使用$refs来访问组件实例或 DOM 元素,有哪些注意事项?
大白话Vue 项目中使用$refs来访问组件实例或 DOM 元素,有哪些注意事项? 在 Vue 项目里,$refs 是个超实用的工具,它能让你直接访问组件实例或者 DOM 元素。不过使用的时候,有一些地方可得注意,下面咱就详细…...
Docker Compose 基础知识
一. Docker Compose 引言 Docker Compose 是 Docker 官方提供的一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个yaml格式的配置文件(通常命名为 docker-compose.yml ),文件中定义多个服务、网络和卷,从而简化复杂应…...
科技赋能|ZGIS综合管网智能管理平台守护地下城市生命线
地下管网作为城市公共安全的重要组成部分,担负着城市的信息传递、能源输送、排涝减灾等重要任务,是维系城市正常运行、满足群众生产生活需要的重要基础设施,是城市各功能区有机连接和运转的维系,因此,也被称为城市“生…...
EXCEL报错:无法共享此工作薄,因表包含excel表或xml映射的解决方法
在分享工作薄是,如果出现了“无法共享此工作薄,因表包含excel表或xml映射”的报错,那么有两个原因: 1.包含Excel表格,这个也是相对比较常见的原因。 首先选中表格。如果你不知道表的位置在哪,那么在Excel左…...
Go 语言标准库中path模块详细功能介绍与示例
Go语言的 path 模块提供了处理斜杠分隔路径的通用方法,适用于跨平台路径操作(如 URL 路径或 Unix 风格路径)。以下是 path 模块的核心方法及示例说明: 1. path.Base 返回路径的最后一个元素(类似 Unix 的 basename 命…...
在Vue 3 + TypeScript + Vite 项目中安装和使用 SCSS
在Vue 3 TypeScript Vite 项目中安装和使用 SCSS 1、安装 SCSS 的相关依赖 npm install sass --save-dev2、配置 Vite 对于 Vue 3,Vite 已经内置了对 SCSS 的支持,通常不需要额外的配置。但是,如果需要自定义配置,可以在路径…...
洛谷题单1-B2005 字符三角形-python-流程图重构
题目描述 给定一个字符,用它构造一个底边长 5 5 5 个字符,高 3 3 3 个字符的等腰字符三角形。 输入格式 输入只有一行,包含一个字符。 输出格式 该字符构成的等腰三角形,底边长 5 5 5 个字符,高 3 3 3 个字符…...
实现金蝶与钉钉无缝对接以高效管理银行账号信息
【资料】金蝶&钉钉—银行账号 在企业信息化管理中,数据的高效集成和实时同步至关重要。本文将分享一个实际的系统对接集成案例:如何将金蝶云星空的数据集成到钉钉平台,实现银行账号信息的无缝对接。 本次集成方案【资料】金蝶&钉钉…...
正则表达式-万能表达式
1、正则 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找 出满足你想要的格式的句子. {“basketId”: 0, “count”: 1, “prodId”: #prodId#, “shopId”: 1, “skuId”: #skuId#} #prodId# re相关的文章: https://www.cnblogs.com/Simple-S…...
ComfyUi教程之阿里的万象2.1视频模型
ComfyUi教程之阿里的万象2.1视频模型 官网Wan 2.1 特点 一、本地安装1.1克隆仓库1.2 安装依赖(1.3)下载模型(1.4)CUDA和CUDNN 二、 使用体验(2.1)官方例子(2.2)执行过程(…...
如何在一个图片上添加另外一个图片
如果你使用的windows10 系统,可以使用系统自带的画图工具 1. 打开windows搜索, 画图工具 2. 在画图软件内, ctrlc 复制图片 , ctrlv粘贴图片 3. 调整想要粘贴的图片,到上图汇总,最后保存,或者…...
【面试题】在 CSS 中,实现一个 div 中的子 div 水平垂直居中
1. 使用 Flexbox 特点:简单、直观,现代浏览器支持良好。 代码: css .parent {display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */height: 200px; /* 父容器需有高度 */ } .child {…...
Electron 项目开机自启动
app.setLoginItemSettings 与 auto-launch 对比分析 一、稳定性对比 1. app.setLoginItemSettings 优点:作为Electron官方API,有官方维护和支持缺点: 在某些Windows版本上存在已知问题部分Windows 10/11更新后可能失效在macOS权限更严格的…...
sql基础
本文多数内容属于个人基于网上资料的理解,如果有问题请告知修改,十分感谢 定义 百度百科:SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言,这种语言具有交互性特点,能为用户提供极…...
【C++数据库】SQLite3数据库连接与操作
注意:本文代码均为C++20标准下实现 一、SQLite3库安装 1.1 安装库文件 【工具】跨平台C++包管理利器vcpkg完全指南 vcpkg install sqlite3# 集成至系统目录,之前执行过此命令的无需再次执行 vcpkg integrate install1.2 验证代码 在VS2022中新建控制台项目,测试代码如下…...
数据结构——Map和Set
1. 搜索树 1. 概念 ⼆叉搜索树⼜称⼆叉排序树,它可以是⼀棵空树,或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空,则左⼦树上所有节点的值都⼩于根节点的值 • 若它的右⼦树不为空,则右⼦树上所有节点的值都⼤于根节点的值…...
zsh安装以及安装配置oh-my-zsh安装zsh-autosuggestionszsh-syntax-highlighting
下面是安装 zsh 及配置 oh‑my‑zsh 的详细步骤,适用于 Linux 和 macOS 环境: 1. 安装 zsh 1.1 在 macOS 上安装 zsh macOS 通常预装了 zsh,但建议升级到最新版本。你可以通过 Homebrew 来安装最新版: brew install zsh安装完成…...
VMware 安装 Ubuntu 实战分享
VMware 安装 Ubuntu 实战分享 VMware 是一款强大的虚拟机软件,广泛用于多操作系统环境的搭建。本文将详细介绍如何在 VMware 中安装 Ubuntu,并分享安装过程中的常见问题及解决方法。 1. 安装前的准备工作 (1) 系统要求 主机操作系统:Windo…...
【SpringCloud】Eureka的使用
3. Eureka 3.1 Eureka 介绍 Eureka主要分为两个部分: EurekaServer: 作为注册中心Server端,向微服务应用程序提供服务注册,发现,健康检查等能力。 EurekaClient: 服务提供者,服务启动时,会向 EurekaS…...
Redis:List 类型 内部实现、命令及应用场景
Redis 中的 List(列表)类型是一种有序的数据结构,它可以存储多个字符串元素,并且这些元素按照插入顺序排列。可以将它理解为一个双向链表,支持在链表的两端进行快速的插入和删除操作。它允许元素重复,并且可…...
Python 字符串正则表达式详解
Python 字符串正则表达式详解 一、正则表达式核心语法 元字符含义正确示例与说明常见错误修正.匹配任意字符(换行符除外)a.b → 匹配"acb"、“a1b”不匹配换行符(需用re.S模式)^匹配字符串开头^Hello → 匹配以"H…...
重试机制之指针退避策略算法
一、目的:随着重试次数增加,逐步延长重连等待时间,避免加重服务器负担。 二、计算公式: 每次重试的延迟时间 初始间隔 (退避基数 ^ 重试次数) 通常设置上限防止等待时间过长。 const delay Math.min(initialDelay * Math.pow…...
pyqt第一个窗口程序
文章目录 官方文档相手动创建窗口程序designer创建ui布局 官方文档相 https://doc.qt.io/qtforpython-6/ 手动创建窗口程序 import sys # 导入系统模块,用于获取命令行参数和系统功能 from PySide6.QtWidgets import QApplication, QLabel # 导入Qt组件&#x…...