Flutter如何在Android上跑起来

本文深入探讨Flutter与原生(Native)应用的混合开发机制,解析Flutter如何在Android环境中启动,以及Flutter与原生界面间如何进行通信与状态感知。通过源码分析,揭示FlutterActivity在生命周期管理中的关键作用。

了解了Flutter的Widget以及Flutter的渲染,突然有新的问题的产生,Flutter如果要和Native进行混合开发,就会产生新的问题,

  • 混合栈管理

比如Flutter要回退到原生界面,原生界面应该如何感知呢,原生界面进入Flutter界面又要怎么通知Native

根据源码加图片来看下Flutter怎么在Android启动

 

Flutter出现的目的旨在统一Android/IOS两端编程,因此完全基于Flutter开发的App,只需提供一个包含FlutterView的页面,后续页面增加/删除/跳转均在FlutterView的Navigator中进行管理。

直接公布最合适的方案

抽取单一FlutterView或FlutterNativeView,后续每启动一个Activity都对FlutterView或FlutterNativeView进行复用

对比RN,native与rn混合开发,是有一个reactActivity,用layoutInspector看下Flutter层面

可以看到flutter基于自身去渲染

接下来用源码看戏FlutterActivity都做了什么操作

public class FlutterActivity extends Activity implements Provider, PluginRegistry, ViewFactory {
    private final FlutterActivityDelegate delegate = new FlutterActivityDelegate(this, this);//1
    private final FlutterActivityEvents eventDelegate;//1
    private final Provider viewProvider;
    private final PluginRegistry pluginRegistry;//2

    public FlutterActivity() {
        this.eventDelegate = this.delegate;
        this.viewProvider = this.delegate;
        this.pluginRegistry = this.delegate;
    }
    …………
}

看下构造函数   

  2.pluginRegistry主要用于原生方法注册通信的,封装一些方法,相当于给Flutter增加插件

1.FlutterActivityEvents是一个接口,具体实现类是FlutterActivityDelegate 给FlutterView发送当前app处于的状态,包括内存和生命周期,上下文,以及intent
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.eventDelegate.onCreate(savedInstanceState);
    }
  public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        this.eventDelegate.onConfigurationChanged(newConfig);
    }

  protected void onPostResume() {
        super.onPostResume();
        this.eventDelegate.onPostResume();
    }
…………

 

1.我们知道当走到Activity的onCreate时,会执行Delegate的onCreate

    public FlutterActivityDelegate(Activity activity, FlutterActivityDelegate.ViewFactory viewFactory) {
        this.activity = (Activity)Preconditions.checkNotNull(activity);
        this.viewFactory = (FlutterActivityDelegate.ViewFactory)Preconditions.checkNotNull(viewFactory);
    }

 

    public void onCreate(Bundle savedInstanceState) {
        if (VERSION.SDK_INT >= 21) {
            Window window = this.activity.getWindow();
            window.addFlags(-2147483648);
            window.setStatusBarColor(1073741824);
            window.getDecorView().setSystemUiVisibility(1280);
        }

        String[] args = getArgsFromIntent(this.activity.getIntent());
        FlutterMain.ensureInitializationComplete(this.activity.getApplicationContext(), args);
        this.flutterView = this.viewFactory.createFlutterView(this.activity);
        if (this.flutterView == null) {
            FlutterNativeView nativeView = this.viewFactory.createFlutterNativeView();
            this.flutterView = new FlutterView(this.activity, (AttributeSet)null, nativeView);
            this.flutterView.setLayoutParams(matchParent);
            this.activity.setContentView(this.flutterView);//1
            this.launchView = this.createLaunchView();
            if (this.launchView != null) {
                this.addLaunchView();
            }
        }

      

1.通过setContentView 将Flutter视图放入window中

看下flutterView

public class FlutterView extends SurfaceView implements BinaryMessenger, TextureRegistry, AccessibilityStateChangeListener {
}

主要是做了native定位、生命周期、以及获取原生一些信息的通道。

### Flutter 和 Go 的基本信息 Flutter 是由 Google 推出的一个开源 UI 软件开发工具包 (SDK),用于构建跨平台应用程序,支持 iOS、Android、Web 和桌面环境。它基于 Dart 编程语言,提供了丰富的 widget 库以及高性能渲染引擎[^1]。 Go(又称 Golang)是一种静态类型的编译型编程语言,设计目标是简单高效并具有强大的并发处理能力。尽管 Go 并不是专门为移动应用开发而生的语言,但它因其性能优势和简洁语法,在后端服务开发领域占据重要地位[^4]。 --- ### Flutter 和 Go 的主要区别 #### 1. **用途** - **Flutter**: 主要专注于前端界面开发,尤其是移动端和多平台应用的用户交互体验。 - **Go**: 更适合于后端服务器逻辑实现、微服务架构搭建以及高并发场景下的数据处理任务[^2]。 #### 2. **语言特性** - **Dart**(Flutter使用的语言):提供热重载功能,允许开发者快速预览更改效果;同时具备垃圾回收机制来简化内存管理过程。 - **Go**:强调极简主义哲学,通过 goroutines 支持轻量级线程操作,从而提升程序运行效率[^3]。 #### 3. **生态系统与社区支持** - **Flutter** 拥有一个活跃且不断增长的插件库生态体系,能够轻松集成第三方服务如 Firebase 等。 - 对比之下虽然也有针对 Android/iOS 原生桥接方案存在,但整体来看围绕 Go 展开的相关资源相对较少一些。 --- ### 使用 Flutter 和 Go 开发应用的最佳实践 当考虑将两者结合起来共同完成整个产品的生命周期时,则需遵循如下原则: #### 设计分离关注点 采用分层架构模式划分前后两端职责边界清晰明了——即让 Flutter 完成所有关于展示层面的工作流定义(视图布局绘制动画过渡特效等等), 同时把业务计算密集型或者涉及网络请求部分交给后台用 Go 来执行. #### 高效通信协议选择 为了保证客户端和服务端之间消息传递的有效性和安全性, 可以选用 RESTful API 或 gRPC 这样的现代远程调用框架作为它们之间的桥梁连接方式之一. 特别是在后者情况下还能享受到二进制序列化的速度增益. #### 自动化测试覆盖范围扩大 无论是UI行为验证还是REST接口响应校验都应该纳入持续集成流水线当中去定期自动化跑一遍脚本文件以便尽早发现问题所在位置进而修复之: 对于前者来说可以借助官方推荐的 `flutter_test` 工具集来进行单元/小部件级别的断言判断; 至于后者则可能需要用到像 testify 这样专门面向Golang项目的mocking library帮助模拟外部依赖条件变化情况下来评估实际影响程度如何. ```python import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData(primarySwatch: Colors.blue), home: MyHomePage(title: 'Home Page'), ); } } ``` 上述代码片段展示了如何创建一个简单的 Flutter 应用入口结构, 类似概念也可以映射到Go中的main函数启动流程里头: ```go package main type MyApp struct{} func (a *MyApp) Build(ctx Context) Panel { ... } ``` 这里我们看到即使是在不同技术栈环境下仍然保持了一定的设计一致性. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值