首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Flutter和iOS原生页面的相互跳转

基础概念

Flutter 是由 Google 开发的一个开源 UI 工具包,用于构建跨平台的应用程序。它使用 Dart 语言编写,并且可以编译成原生 ARM 和 x86 代码,从而在 iOS 和 Android 平台上提供高性能的用户界面。

iOS 原生页面指的是使用 Swift 或 Objective-C 编写的 iOS 应用程序页面。

相互跳转的优势

  • Flutter 到 iOS 原生页面
    • 利用原生功能:当 Flutter 应用需要使用一些 Flutter 暂时不支持或者性能不佳的原生功能时,可以通过跳转到原生页面来实现。
    • 性能优化:对于一些复杂的动画或者计算密集型任务,原生页面可能会有更好的性能表现。
  • iOS 原生到 Flutter 页面
    • 代码复用:如果你已经有一个 Flutter 应用的部分功能,可以通过嵌入 Flutter 页面来复用这些代码。
    • 统一 UI:Flutter 提供了一套丰富的 Material Design 和 Cupertino(iOS 风格)组件,可以在原生应用中保持 UI 的一致性。

类型

  • Flutter 到 iOS 原生页面
    • 使用 MethodChannelEventChannel 进行通信,然后从 Flutter 调用原生代码打开一个新的原生视图控制器。
    • 使用 FlutterViewController 在 iOS 应用中嵌入 Flutter 页面,并通过导航控制器进行跳转。
  • iOS 原生到 Flutter 页面
    • 在原生代码中创建一个 FlutterViewController 实例,并将其推入导航栈。
    • 使用 FlutterEngine 来管理 Flutter 的生命周期,这样可以在不重启 Flutter 引擎的情况下切换页面。

应用场景

  • Flutter 到 iOS 原生页面
    • 当需要使用 iOS 独有的 API,如 HealthKit 或 CoreLocation。
    • 当需要与已有的原生库或框架集成时。
  • iOS 原生到 Flutter 页面
    • 当需要展示一个跨平台的 UI 组件,如地图或者视频播放器。
    • 当需要复用 Flutter 中已经实现的业务逻辑或 UI 组件时。

遇到的问题及解决方法

问题:Flutter 页面无法跳转到 iOS 原生页面

原因:可能是 Flutter 与原生代码之间的通信没有正确设置,或者原生代码中缺少相应的跳转逻辑。

解决方法

  1. 确保在 iOS 原生代码中正确设置了 MethodChannel
  2. 在 Flutter 代码中调用 MethodChannel 的方法来触发原生代码执行跳转逻辑。
  3. 检查原生代码中是否有导航控制器的实例,并且是否正确地创建了新的视图控制器实例。

示例代码(Flutter 到 iOS 原生页面)

Flutter 代码

代码语言:txt
复制
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter to Native')),
        body: Center(
          child: ElevatedButton(
            onPressed: _navigateToNative,
            child: Text('Go to Native Page'),
          ),
        ),
      ),
    );
  }

  void _navigateToNative() async {
    const platform = MethodChannel('com.example/native');
    try {
      await platform.invokeMethod('navigateToNativePage');
    } on PlatformException catch (e) {
      print("Failed to navigate: ${e.message}");
    }
  }
}

iOS 原生代码(Objective-C):

代码语言:txt
复制
#import <Flutter/Flutter.h>
#import <UIKit/UIKit.h>

@interface AppDelegate: UIResponder <UIApplicationDelegate>
@property (nonatomic, strong) FlutterViewController *flutterViewController;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.flutterViewController = [[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil];
    [GeneratedPluginRegistrant registerWithRegistry:self.flutterViewController];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = self.flutterViewController;
    [self.window makeKeyAndVisible];

    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
    if ([call.method isEqualToString:@"navigateToNativePage"]) {
        UIViewController *nativeViewController = [[UIViewController alloc] init];
        nativeViewController.view.backgroundColor = [UIColor whiteColor];
        [self.flutterViewController.navigationController pushViewController:nativeViewController animated:YES];
        result(nil);
    } else {
        result(FlutterMethodNotImplemented);
    }
}

@end

参考链接

  • Flutter 官方文档关于平台通道(Platform Channels):https://flutter.dev/docs/development/platform-integration/platform-channels
  • Flutter 官方文档关于嵌入 Flutter 页面到原生应用:https://flutter.dev/docs/development/add-to-app/ios/project-setup

请注意,以上代码仅为示例,实际应用中需要根据具体情况进行调整。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JDFlutter | 京东技术中台新一代跨平台开发框架

开发者借助 Flutter 开发平台可轻松实现自己的应用,其开发框架默认支持了 Material(类似 Google 设计风格)和 Cupertion(类似 iOS 设计风格)两种风格,且无论从UI样式...然而在大多数情况下,我们面临的是现有 APP 已上线很久,新的页面或者部分页面的改造需要尝试去使用 Flutter 开发,在这种情况下,我们需要创建一个 Flutter 模块,用于完成 Flutter...未来我们会增加对 ios 模拟器的支持,点击“启动 Flutter 调试”即可启动模拟器直接跳转到对应的页面。...▲JDFlutter 签到排行榜 数据统计 JDFlutter 对线上数据进行统计主要包括业务数据和异常数据,无论是哪一方面的数据出现异常,都要及时采取措施。...▲数据统计 方案1:在原生跳转入口处增加埋点。 方案2:在Flutter入口main路由中增加页面埋点。 方案3:在Flutter业务页面中增加埋点。

10K51

轻松 Flutter 入门,秒变大前端

Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 具有跨平台开发特性,支持IOS、Android、Web三端。...2.1 H5+原生APP 图片来源于网络 技术门槛最低,接入速度最快,热更新最方便的,自然就是H5方式。APP中提供一个Webview使用H5页面的Http直连。...APP和H5可以相互独立开发,JS使用Bridge与原生进行数据通信,显示界面依赖Webview的浏览器渲染。...页面结构关系如下: 6.路由 实际的项目,是有多个不同的页面的,页面之间的跳转,就要用到路由了。我们增加一个list页面,点击Home页的“Click Me”按钮,跳转到列表页list。...6.3 路由传参 列表页跳转到详情页,需要路由传参,这个在flutter体系里,又是怎么做的呢?

4.2K30
  • 【Flutter 混合开发】添加 Flutter 到 Android Activity

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生通信...-EventChannel 添加 Flutter 到 Android Activity 添加 Flutter 到 Android Fragment 添加 Flutter 到 iOS 每个工作日分享一篇,...启动页加载 Flutter 将 Flutter 页面加载到 MainActivity(默认启动页) 中,修改 MainActivity : package com.flutter.androidflutter...跳转到 Flutter 页面 MainActivity(默认启动页)添加一个按钮,点击后跳转到新的页面,此页面加载 Flutter ,MainActivity代码如下: package com.flutter.androidflutter...为了减少 FlutterActivity 页面的延迟时间和多个 FlutterActivity 实例内存一直增长问题,我们可以使用 Flutter 引擎(FlutterEngine)缓存,在启动 FlutterActivity

    1.4K40

    【Flutter 混合开发】与原生通信-MethodChannel

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生通信...-EventChannel 添加 Flutter 到 Android Activity 添加 Flutter 到 Android Fragment 添加 Flutter 到 iOS 每个工作日分享一篇,...平台通信的3中方式 Flutter 与 Native 端通信有如下3个方法: MethodChannel:Flutter 与 Native 端相互调用,调用后可以返回结果,可以 Native 端主动调用...call.argument 是 invokeMethod 传入的参数,由于 Flutter 端传入的是 Map,所以上面的解析按照 Map 解析。...iOS 端 ios 下创建 MethodChannelDemo,按如下方式: import Flutter import UIKit public class MethodChannelDemo {

    1.6K10

    Flutter与原生工程的混合开发

    原因就在于,一个Flutter开发工程师可能对于iOS原生和安卓原生都不了解,这样的话,让他直接在原生工程中写原生代码,实际上是比较为难的。...工程的android和ios文件夹名称前面都有一个....在原生工程中跳转到指定的Flutter页面 在原生工程中是可以指定跳转到Flutter模块的哪一个页面的,步骤如下。...在原生工程中高性能地跳转到指定的Flutter页面 上面的这种方式,每跳入一个新的Flutter页面就会重新创建FlutterVC,很吃内存,因此我们就想,可否将FlutterVC和FlutterEngine...我们在真正的开发时,一般不会频繁的在原生页面和Flutter页面之间切换,在原生工程跳转到某个Flutter页面之后,余下的页面最好能形成一个闭环。

    1.4K40

    Flutter 实现原理及在马蜂窝的跨平台开发实践

    RN 使用类 HTML+JS 的 UI 创建逻辑,生成对应的原生页面,将页面的渲染工作交给了系统,所以渲染效率有很大的优势。...Flutter 中的控件树直接由渲染引擎和高性能本地 ARM 代码直接绘制,不需要通过中间对象(Web 应用中的虚拟 DOM 和真实 DOM,原生 App 中的虚拟控件和平台控件)来绘制,使它有接近原生页面的性能...Flutter 与 Native 性能对比 我们分别使用 Native 和 Flutter 开发了两个列表页,以下是页面效果和性能对比: iOS 对比(机型 6P 系统 10.3.3): Flutter...这和原生开发类似,无论是 Android 还是 iOS,导航管理都会维护一个路由栈,路由入栈 (push) 操作对应打开一个新页面,路由出栈 (pop) 操作对应页面关闭操作,而路由管理主要是指如何来管理路由栈...每一次的 push/pop 由 Native 发起,同时通过 channel 保持 Native 与 Flutter 页面同步——在 Native 中跳转 Flutter 页面与跳转原生无差异 一个 Flutter

    2K20

    Flutter 在铭师堂的实践

    对于原生开发来说,后面的构建打包等持续集成都不会收到 flutter 的影响。...如果依赖其他的插件,必须自己写脚本解决上面的依赖问题。从维护的角度看,插件工程仍然需要至少一个android 同学 加一个 iOS 同学进行维护。...我们的容器页面其实就是一个 FlutterActivity,我们给容器也设置了一个 path,原生在跳转flutter的时候,其实是跳转到了这个容器页。...这个开关目前还是高粒度的,控制在进入 Flutter 页面的时候是否跳转容器页。...跳转到对应的原生页面或者报错页。 线上开关可以和 APP 现有的无线配置中心对接。如果线上出现 Flutter 的质量问题。我们可以下发配置来控制页面跳转实现降级。

    93310

    大前端开发中的路由管理之三:Android篇

    、多Activity多Fragment跳转,以及Activity与Fragment相互跳转。...Navigation和Flutter的路由有一定的相似性,这里是将frament作为跳转点,在开发时,可以清晰地看到每个界面的跳转路径。...3.3 Activity-Flutter         简单地来说,Flutter是使用跨平台的图形渲染引擎在view上画控件,Activity-Flutter之间的页面跳转和Activity-React...我们知道Android的页面跳转是通过Intent、Flutter是通过Widget进行路由管理,在Android原生页面与Flutter之间的页面管理如图所示。...由此可知,对于更加复杂的如Flutter-Flutter-原生-Flutter-原生-原生页面间跳转等情况,同样可拆分为由任务栈管理、由Widget路由管理、以及由Channel方式实现路由管理。

    3.3K11

    转发 | 闲鱼公开多年 Flutter 实践经验

    ,我们将原生工程进行了软链接,链接到flutter工程的ios目录和android目录,flutter在运行前会找到工程下的ios或android目录然后运行,在flutter工程下运行iOS工程会存在一个限制...原生的测试跳转入口。...★ 页面路由的配置 demo形式的dart页面,路由配置即路由到某个标识符时,flutter或原生页面需要识别并跳转相应页面。路由的配置需要在原生和flutter两侧进行部署。...在flutter侧我们对main.dart文件进行了覆盖,将带有路由逻辑的main.dart集成进来,同时提供了demo dart页面的创建逻辑。...★ 原生的测试跳转入口 为了方便使用者快速看到混合工程的跳转模式,我们在iOS和android双端封装了一个入口按钮和按钮的添加过程,使用者在测试的页面手动加入一行代码,即可看到跳转flutter的入口

    1.7K30

    Flutter混合栈路由实践与优化

    这样并不影响原有的业务和原生能力,又可以结合业务需求进行技术选择。 混合栈涉及到 Flutter 页面与原生页面的跳转。而官方的路由方案,在多引擎下有着通信隔离,资源不共享,极大的内存损耗等缺陷。...下图所示是 Android 侧单引擎下打开 5 个页面内存增量对比: 可以看出 Android 侧跳转 Flutter 页面的内存消耗已降低到接近原生。...痛点一:iOS侧内存增长异常 但在 iOS 侧,我们发现了打开新的承载 Flutter 页面的 ViewController 仍会有 10M 左右的内存增量。...值得注意的是,Dart 和 Native 层是职责分离的。 Dart 层只负责接收原生端生命周期信息,并得到页面的 url 与 params,来进行 Flutter 的页面渲染。...而 Native 层统一接管了页面的跳转和 url 解析,在跳转 Flutter 页面时,感知上仍是打开一个 Activity/ViewController。

    2.8K51

    Android开发者的Flutter入门(二)

    涉及到的有以下这些点: 闪屏页 自定义布局 下拉刷新 上拉加载更多 使用Assets 路由(页面跳转) 内嵌WebView 闪屏页 由于启动Flutter app的时候需要初始化Flutter...所以开发Flutter app的时候都需要加一个闪屏页。给Android平台上跑的Flutter app加闪屏页其实是和给一个正常的Android app加闪屏页是一样的。...LaunchTheme 可见就定义了一个窗口的背景了,也就是我们的闪屏页本尊了,这里你可以把这个drawable改成你自己的闪屏页图片也OK。 至于ios平台的闪屏页怎么弄,可以参考这里。...路由(页面跳转) Android中我们都是用startActivity或者第三方路由库来做页面跳转,在Flutter中,使用内置的Navigator来做跳转的。...总体感觉来讲,用Flutter开发app可以体会到很多不同于Android 原生app开发的理念。对于我们开阔自己的技术思想还是有很有价值的。

    1.4K20

    2020 Flutter开源资源索引

    一种是,将 Flutter 工程内嵌 Android 和 iOS 工程,由 Flutter 统一管理的集中模式;另一种是,将 Flutter 工程作为原生工程共用的子模块,由原生工程各自管理的三端工程分离模式...(2)如何统一管理原生页面和 Flutter 页面跳转交互的混合导航栈 对于混合开发的应用而言,通常我们只会将应用的部分模块修改成 Flutter 开发,其他模块继续保留原生开发,因此应用内除了 Flutter...的页面之外,还会有原生 Android、iOS 的页面。...在这种情况下,Flutter 页面有可能会需要跳转到原生页面,而原生页面也可能会需要跳转到 Flutter 页面。...这就涉及到了一个新的问题:如何统一管理原生页面和 Flutter 页面跳转交互的混合导航栈。

    1.6K60

    Flutter 实现视频全屏播放逻辑及解析

    最后如下代码所示,只需要通过 Navigator 调用页面跳转就可以实现全屏和非全屏的无缝切换了。...所以 Flutter 中控件的渲染堆栈是独立的,没办法和原生平台直接混合使用,这时候为了能够在 Flutter 中插入原生平台的部分功能,Flutter 除了提供了 PlatformView 这样的实现逻辑之外...所以在前面的代码中,需要在全屏和非全屏页面使用同一个 VideoPlayerController,这样它们就具备了同一个 textureId。...具备同一个 textureId 后,那么只要原生层不停止播放, textureId 对应的原生数据就一直处于更新状态,而这时候虽然跳转路由页面,但不同的 VideoPlayer 内部的 Texture...如下图所示,这个过程简单总结就是: Flutter 和原生平台通过 PixelBuffer 为介质进行交互,原生层将数据写入 PixelBuffer ,Flutter 通过注册好的 textureId

    3.3K10

    跨平台开发框架和工具集锦

    我们倒不如来研究一下,这个跨平台技术适不适用以及性能和稳定性等方面的做个比较。 一、为什么需要跨平台?...通过公众号关联,用户可以实现公众号与小程序之间相互跳转。由于无需下载App,小程序推广起来更方便。 小程序的缺点:小程序是依附于微信的,所以很多功能局限于微信团队提供的API,你不好扩展功能。...这种类似的开发模式就需要原生开发人员和前端开发人员密切配合(有些公司资源紧缺由单人负责这个项目)。 本文首发于我的公众号Flutter那些事,未经授权严禁转载!...,通过JS可以直接调iOS和Android的原生API(通过plus.ios调用iOS原生API,通过plus.android调用Android原生API)。...用户无需下载安装,即点即用,享受原生应用的性能体验。使用前端技术栈开发,原生渲染,同时具备H5页面和原生应用的双重优点。

    4K30

    Flutter技术与实战(6)

    比如,位于第 4 层的网络引擎中,会针对特定的错误码跳转到位于第 1 层的统一错误页,这时我们就可以利用 Router 提供的命名路由跳转,在不感知错误页的实现情况下来完成。...在下面的代码中,我们定义了两个并发任务,即运行在 Linux 上的 Android 构建任务执行 flutter build apk,和运行在 OS X 上的 iOS 构建任务 flutter build...下面的例子演示了 Flutter Module 的 iOS 产物是如何实现自动发布的。...如何构建自己的Flutter混合开发框架(二) 在 Flutter 混合框架中,Flutter 模块与原生工程是相互依存、互利共赢的关系。...原生插件依赖管理原则 在“如何在Dart层兼容Android/iOS平台特定实现(一)”和“如何实现原生推送能力”里,我与你讲述了为 Flutter 应用中的 Dart 代码提供原生能力支持的两种方式,

    2.8K21
    领券