一周掌握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 提供了强大的跨平台开发能力,但…...
鸿蒙阔折叠Pura X外屏开发适配
首先看下鸿蒙中断点分类 内外屏开合规则 Pura X开合连续规则: 外屏切换到内屏,界面可以直接接续。内屏(锁屏或非锁屏状态)切换到外屏,默认都显示为锁屏的亮屏状态。用户解锁后:对于应用已适配外屏的情况下,应用界面可以接续到外屏。折叠外屏显示展开内屏显示折叠状态…...
小程序中跨页面组件共享数据的实现方法与对比
小程序中跨页面/组件共享数据的实现方法与对比 在小程序开发中,实现不同页面或组件之间的数据共享是常见需求。以下是几种主要实现方式的详细总结与对比分析: 一、常用数据共享方法 全局变量(getApp())、本地缓存(w…...
Java 大视界 -- 基于 Java 的大数据分布式计算在基因测序数据分析中的性能优化(161)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
go游戏后端开发21:处理nats消息
处理 NATS 订阅的消息 在 WebSocket 的管理模块中,我们之前已经处理了一些消息。这些消息通过 NATS 订阅过来,我们需要对这些消息进行进一步的处理。一旦消息到达,我们需要执行相应的操作,并将结果发送回去,包括之前的…...
4.1-python操作wrod/pdf 文件
1.读取word文件 首先安装软件包 pip3 install python-docx from docx import Documentimport os path os.path.join(os.getcwd(),你的文档名字.docx)# 加载文档 doc Document(path)# 遍历数据 for p in doc.paragraphs:print(p.text)# 遍历文档中所有表格 for t in doc.t…...
Android 应用程序包的 adb 命令
查看所有已安装应用的包名 命令:adb shell pm list packages说明:该命令会列出设备上所有已安装应用的包名。可以通过管道符|结合grep命令来过滤特定的包名,例如adb shell pm list packages | grep com.pm,这将只显示包名中包含co…...
DeepSeek-R1 模型现已在亚马逊云科技上提供
2025年3月10日更新—DeepSeek-R1现已作为完全托管的无服务器模型在Amazon Bedrock上提供。 2025年2月5日更新—DeepSeek-R1 Distill Llama 和 Qwen模型现已在Amazon Bedrock Marketplace和Amazon SageMaker JumpStart中提供。 在最近的Amazon re:Invent大会上,亚马…...
Python数据可视化-第2章-使用matplotlib绘制简单图表
环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容,本章为第2章 使用matplotlib绘制简单图表 本文主要介绍了折线图、柱形图或堆积柱形图、条形图或堆积条形图、堆积面积图、直方图、饼图或…...
TDengine 快速上手:安装部署与基础 SQL 实践(二)
三、生产环境优化方案 3.1 性能调优策略 在生产环境中,TDengine 的性能优化是确保系统高效稳定运行的关键。以下是一些有效的性能调优策略。 连接池是提升数据库连接管理效率的重要工具,它允许应用程序重复使用现有的数据库连接,而不是每次…...
金融级密码管理器——密码泄露监控与自动熔断
目录 金融级密码管理器 —— 密码泄露监控与自动熔断一、模块概述与设计背景1.1 背景与挑战1.2 设计目标二、系统架构设计2.1 系统架构图(Mermaid示意图)三、关键技术与安全算法3.1 密码泄露监控3.2 自动熔断机制3.3 安全日志记录3.4 数据可视化与状态统计四、GUI与Dash仪表盘…...
mysql 主从搭建步骤
主库: 开启log-bin参数,log-bin 参数修改需要重启服务器 --You can change the server_id value dynamically by issuing a statement like this:SET GLOBAL server_id 2;--to enable binary logging using a log file name prefix of mysql-bin, and c…...
Redis 02
今天是2025/04/01 20:13 day 16 总路线请移步主页Java大纲相关文章 今天进行Redis 3,4,5 个模块的归纳 首先是Redis的相关内容概括的思维导图 3. 持久化机制(深度解析) 3.1 RDB(快照) 核心机制: 触发条件ÿ…...
unity UI管理器
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events;// UI界面基类 public abstract class UIBase : MonoBehaviour {[Header("UI Settings")]public bool keepInStack true; // 是否保留在界面栈中public …...
PyTorch深度学习框架60天进阶学习计划-第29天:自监督学习-问题解答(一)
PyTorch深度学习框架60天进阶学习计划-第29天:自监督学习-问题解答(一) 问题: 关于自监督的目标检测模型,怎么联动yolo。 一、 如何与YOLOv7联动? 步骤概述 确定自监督模块的接入位置 在YOLOv7的主干网络…...
GIT 撤销上次推送
注意:在执行下述操作之前先备份现有工作进度,如果不慎未保存,在代码编辑器中正在修改的文件下,使用CtrlZ 撤销试试 撤销推送的方法 情况 1:您刚刚推送到远程仓库 如果您的推送操作刚刚完成,并且没有其他…...
STRUCTBERT:将语言结构融入预训练以提升深度语言理解
【摘要】最近,预训练语言模型BERT(及其经过稳健优化的版本RoBERTa)在自然语言理解(NLU)领域引起了广泛关注,并在情感分类、自然语言推理、语义文本相似度和问答等各种NLU任务中达到了最先进的准确率。受到E…...
【万字总结】前端全方位性能优化指南(八)——Webpack 6调优、模块联邦升级、Tree Shaking突破
构建工具深度优化——从机械配置到智能工程革命 当Webpack配置项突破2000行、Node进程内存耗尽告警时,传统构建优化已触及工具链的物理极限:Babel转译耗时占比超60%、跨项目模块复用催生冗余构建、Tree Shaking误删关键代码引发线上事故……构建流程正从「工程问题」演变为「…...
单例模式(懒汉模式/饿汉模式)
相关概念参考:【C】C 单例模式总结(5种单例实现方法)_单例模式c实现-CSDN博客 #include<iostream>class LazySingle{ public:static LazySingle& getInstance(){static LazySingle instance;return instance;}void hello(){std::c…...
16-CSS3新增选择器
知识目标 掌握属性选择器的使用掌握关系选择器的使用掌握结构化伪类选择器的使用掌握伪元素选择器的使用 如何减少文档内class属性和id属性的定义,使文档变得更加简洁? 可以通过属性选择器、关系选择器、结构化伪类选择器、伪元素选择器。 1. 属性选择…...
C语言pthread库的线程休眠和唤醒的案例
一、代码如下 #include<stdio.h> #include<pthread.h> // 定义独占锁 pthread_mutex_t mutex; // 定义条件信号对象 pthread_cond_t condition; // 初始化函数 void init(){ int code pthread_mutex_init(&mutex, NULL); printf("共享锁初…...
Spring Boot 2.x 到 3.x 迁移实战:Redis 配置篇
前言 随着 Spring Boot 3.x 的发布,其对 Java 17 的支持和 模块化架构 的深化,Redis 配置与集成方式发生了显著变化。今天简单讲下redis的变化 一、Redis 配置前缀的模块化演进:从 spring.redis 到 spring.data.redis 1.1 Spring Boot 2.x&…...
SQL Server:用户权限
目录 创建 & 删除1. 创建用户命令整理创建 admin2 用户创建 admin_super 用户 2. 删除用户命令删除 admin2 用户删除 admin_super 用户 3. 创建时权限的区别admin2 用户权限admin_super 用户权限 查看方法一:使用对象资源管理器(图形化界面ÿ…...
Windows .gitignore文件不生效的情况排查
概述 今天下班在家里捣腾自己的代码,在配置.gitignore文件忽略部分文件的时候,发现死活不生效 问题根源 经过一通分析和排查才发现,是.gitignore文件的编码错了,刚开始还没注意到,因为是在Windows下开发,…...
cJSON 处理 JSON(轻量级 C 语言库)(二)
第二部分:cJSON 处理 JSON(轻量级 C 语言库) 📢 快速掌握 cJSON!文章 + 视频双管齐下 🚀 如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 cJSON 课程视频!🎬 视频里会用更直观的方式讲解 cJSON 的核心概念、实战技巧,并配有动手演示…...
服务器数据恢复—误格式化NTFS文件系统分区别慌,NTFS数据复活秘籍
NTFS文件系统下格式化在理论上不会对数据造成太大影响,但有可能造成部分文件目录结构丢失的情况。下面介绍一个人为误操作导致服务器磁盘阵列中的NTFS文件系统分区被格式化后的服务器数据恢复案例。 服务器数据恢复过程: 1、将故障服务器连接到一台备份…...
《Linux运维总结:基于银河麒麟V10+ARM64架构CPU源码编译部署单实例redis7.2.6》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、环境信息 环境信息如下: 主机IP 操作系统 Redis版本 CPU架构 192.168.1.111 K…...
华为云对象存储服务(OBS)
华为云对象存储服务(OBS) 前言 华为云为开发者提供了丰富的 Java SDK,借助这些 SDK 能够方便地与华为云的各类服务进行交互。下面以 华为云对象存储服务(OBS) 的 Java SDK 为例,介绍其使用步骤。 华为云…...
【3】数据结构的双向链表章
目录标题 双向链表的定义双向链表的初始化双向链表的创建插入操作删除操作 双向链表总代码与调试 双向链表的定义 结点结构组成:数据域(data)、指针域(pre)、指针域(next)。其中, da…...
分布式环境下的主从数据同步
目录 1. 数据同步的推/拉方式 1.1 主节点推送 1.2 从节点拉取 1.3 常见组件的推拉方式 2.复制方式 2.1 同步复制 2.2 异步复制 2.3 半同步复制 2.4 常见组件的同步方式 3.日志格式 3.1 基于语句复制 SBR 3.2 基于行复制 RBR 3.3 基于预写日志 WAL 3.4 基于触发器…...
