Flutter入门:application、module、package、plugin

简介: 我们用AS创建flutter项目时,会看到几个选项:application、module、package、plugin。

我们用AS创建flutter项目时,会看到几个选项:application、module、package、plugin。

application


就是一个新flutter app,这个没什么可说的


module


在android或ios项目中添加一个flutter模块。 这个的作用是在原有的项目中使用flutter,不改变原项目结构。所以说这个并不是在flutter项目使用的。


package


package和plugin都是可以发布到pub仓库的,可以说是公开的通用库。区别是package是纯dart的,而plugin是包括android和ios的。


plugin


当我们引用plugin到自己的项目里,打包的时候就会将其下的android和ios相关代码和文件与主项目里对应的平台代码合并到一起。

plugin也可以不发布到pub仓库,在本地直接引用。

比如我们在一个项目里new -> module -> flutter plugin,创建一个名为flutter_core的plugin,这时候我们只要在pubspec.yaml中添加


dependencies:
  flutter:
    sdk: flutter
  ...
  flutter_core:
    path: flutter_core
复制代码


这样就可以将plugin依赖进来使用了


plugin中android代码编译问题


但是,上面这样还有一个问题,plugin下的android目录在本项目里无法按android来编译,所以在编写android代码时没有任何补全和错误提示。

我的解决方法是不以moudle形式创建,而在项目中创建一个plugins目录,然后new -> new flutter project -> flutter plugin,以项目的形式创建一个plugin,而这个plugin的项目路径选在新创建的plugins目录下。

在该项目中,这个plugin中的android目录还是无法按android编译,但是我们可以单独打开这个plugin的工程,这样就正常编译了。

而在主项目中,这个plugin会被自动识别的,所以我们只要修改依赖即可

dependencies:
  flutter:
    sdk: flutter
  ...
  flutter_core:
    path: plugins/flutter_core
复制代码


plugin中kotlin编译问题


上面我们以工程的方式打开plugin,其下的android代码就可以正常编译使用了。但是还有另外一个问题,我们发现kotlin还无法编译使用,也就是或kotlin标准的api,比如let函数找不到,直接报错。

经过对比发现在plugin的根目录下的.idea/libraries目录下缺少KotlinJavaRuntime.xml这个文件。这个文件在pliugin的example项目中有,可以拷贝一份过来

然后重新打开plugin的工程,发先kotlin代码可以正常编译使用了。

添加前,在依赖列表External Libraries中 image 没有KotlinJavaRuntime,添加后就出现了,这样我们才可以使用kotlin标准库

网络异常,图片无法展示
|


plugin中android代码如何获得context?


plugin的作用就是有原生实现一个功能,然后与flutter进行交互。

那么在plugin中要实现一个安卓的功能,不可避免的需要用到Context,因为很大一部分android api都需要它。

但是在plugin中,因为入口不是activity也是application,那么这个context我们怎么获取?

我们创建plugin后,会看到在其下的Android目录中自动创建了一个类


public class XXXX: FlutterPlugin, MethodCallHandler {
  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
    val channel = MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "flutter_xxx")
    channel.setMethodCallHandler(XXXX());
  }
  companion object {
    @JvmStatic
    fun registerWith(registrar: Registrar) {
      val channel = MethodChannel(registrar.messenger(), "flutter_xxx")
      channel.setMethodCallHandler(XXXX())
    }
  }
  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
    when(call.method){
      "getPlatformVersion" -> result.success("Android ${android.os.Build.VERSION.RELEASE}")
      else -> result.notImplemented()
    }
  }
  override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
  }
}
复制代码


这个类继承FlutterPlugin这个抽象类,实现了onAttachedToEngine这个函数,通过函数名可以知道它会最开始执行。

它的参数是FlutterPlugin.FlutterPluginBinding,这个对象里就有我们需要的context,我们可以新建一个static变量来保存它,如下


public class XXXX: FlutterPlugin, MethodCallHandler {
  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
    mContext = flutterPluginBinding.applicationContext
    ...
  }
  companion object {
    var mContext : Context? = null
    ...
  }
  ...
}
复制代码

这样我们在plugin中就可以随时使用context了。


目录
相关文章
|
6天前
|
Dart 前端开发 JavaScript
Flutter&Dart-异步编程Future、Stream极速入门
Flutter&Dart-异步编程Future、Stream极速入门
26 4
Flutter&Dart-异步编程Future、Stream极速入门
|
3月前
|
Dart 前端开发 开发工具
【Flutter前端技术开发专栏】Flutter入门指南:搭建开发环境与第一个应用
【4月更文挑战第30天】本文介绍了Flutter SDK的安装和配置过程,以及如何创建并运行第一个Flutter应用。首先确保安装了Dart SDK和Flutter SDK,支持macOS、Linux和Windows。安装完成后,设置环境变量,然后通过`flutter doctor`验证安装。接着,使用`flutter create`命令创建新项目,进入项目目录并运行`flutter run`启动应用。在`main.dart`中修改代码以自定义应用。Flutter支持热重载和DevTools调试。本文为Flutter初学者提供了快速入门的指导。
63 0
【Flutter前端技术开发专栏】Flutter入门指南:搭建开发环境与第一个应用
|
1月前
|
开发框架 Dart Java
Flutter入门进阶之旅(一)-初识Flutter
Flutter 的目标是用来创建高性能、高稳定性、高帧率、低延迟的 Android 和 iOS 应用。并且开发出来的应用在不同的平台用起来跟原生应用具有一样的体验。不同的平台的原生体验应该得到保留,让该应用看起来同整个系统更加协调。不同平台的滚动操作、字体、图标 等特殊的特性 应该和该平台上的其他应用保持一致,让用户感觉就像操作原生应用一样。
35 1
|
30天前
|
Dart 搜索推荐
Flutter入门进阶之旅(二)Hello Flutter
好像几乎我们学习或者掌握任何一门编程语言都是Hello word开始的,本篇博文做为Flutter入门进阶的第一篇分享,我们也从最简单的Hello world开始,至于Flutter开发环境的配置,跟关于Dart语言的介绍,不是该专栏要讲解的内容,我就不详细做介绍了,读者可自行google或者百度了解一下。
33 0
|
3月前
|
数据库 Android开发
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
|
3月前
|
Dart 开发者
Flutter入门之Dart中的并发编程、异步和事件驱动详解
Flutter入门之Dart中的并发编程、异步和事件驱动详解 Dart是一种高效、快速、灵活且用于Web和移动应用程序开发的编程语言。在Dart中,支持并发编程、异步和事件驱动等特性,这些特性使得Dart在处理诸如网络请求、文件I/O、用户输入等方面表现出色。本文将详细介绍Dart中的这些特性。
|
11月前
|
Web App开发 Dart 开发工具
谷歌移动UI框架Flutter入门
谷歌移动UI框架Flutter入门
|
12月前
|
Dart
Flutter 入门指南之 Dart 语言基础介绍
Dart是一种由Google开发的通用编程语言,用于构建跨平台的移动、Web和桌面应用程序。以下是Flutter入门指南中的Dart语言基础知识:
|
Dart IDE Unix
Flutter:创建和发布一个 Dart Package
在 Dart 生态系统中使用 packages(包) 实现代码的共享,比如一些 library 和工具。本文旨在介绍如何创建和发布一个 package。
424 0
Flutter:创建和发布一个 Dart Package
|
存储 前端开发 JavaScript
Flutter私服搭建之package查询
目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用。
116 0