Flutter 插件使用必知必会

  • iOS

  • ios/Runner目录下自动生成的GeneratedPluginRegistrant.m中,会添加插件的注册代码。

#import “GeneratedPluginRegistrant.h”
#import <url_launcher/UrlLauncherPlugin.h>

@implementation GeneratedPluginRegistrant

  • (void)registerWithRegistry:(NSObject*)registry {
    [FLTUrlLauncherPlugin registerWithRegistrar:[registry registrarForPlugin:@“FLTUrlLauncherPlugin”]];
    }

@end

  • AppDelegate.swift启动后去调用注册

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate, WXApiDelegate {

override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}

  1. 在项目文件中 import 所需的包名,并使用

  2. 如果依赖中存在 platform-specific code (Java/Kotlin for Android, Swift/Objective-C for iOS),要确保代码能够编译进 App ,必须 Restart App,防止发生MissingPluginException异常。Hot reload 或者 Hot restart 只对 dart 代码有效。

版本约束

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  • 主版本号:当你做了不兼容的 API 修改,
  • 次版本号:当你做了向下兼容的功能性新增,
  • 修订号:当你做了向下兼容的问题修正。

更详细的参考语义化版本

基本用法:

any # 所有版本,等同于不写。对pub运行性能有影响,不推荐
1.2.3 # 明确的版本号
‘>=1.2.3’ # 还有 >1.2.3, <=1.2.3, <1.2.3
^1.2.3 # Caret syntax 等同于 >=1.2.3 <2.0.0

注意:如果在版本约束中使用了’>‘,’<'字符,一定要加引号,否则无法被当作 YAML 的语法解析

版本冲突

如果项目依赖了 A , B 库,他们都依赖了一个 C ,但 C 的版本不同,可能会产生版本冲突。pub 会尝试找到符合所有依赖约束的版本号。如果找不到能匹配的版本,但 AB 库依赖 C 库的 API 是一样的,那么可以添加一个依赖覆盖来强制指定某一版本。

注:pub 是 Dart SDK 提供的一个包管理工具

dependencies:
some_package:
other_package:
dependency_overrides:
url_launcher: ‘0.4.3’

如果是 Android 平台的库依赖冲突,可以在 appgradle 文件中强制指定版本

configurations.all {
resolutionStrategy {
force ‘com.google.guava:guava:23.0-android’
}
}

注意: iOS 平台下 CocoaPods 不支持强制版本覆盖

从不同的依赖源添加依赖

SDK

The SDK source is used for any SDKs that are shipped along with packages, which may themselves be dependencies. Currently, Flutter is the only SDK that is supported.

通俗讲,就是 Flutter SDK 自带的库。打开我们 Flutter 的安装地址,进入flutter/packages可以看到各种包,如flutter,flutter_driver,flutter_test等。

➜ packages git:(stable) ✗ ls
analysis_options.yaml flutter_localizations
flutter flutter_test
flutter_driver flutter_tools
flutter_goldens fuchsia_remote_debug_protocol
flutter_goldens_client
➜ packages git:(stable) ✗ pwd
/Users/xxx/flutter/packages

在 Flutter 项目中写过测试的同学对上面几个依赖应该不陌生

dependencies:
flutter:
sdk: flutter # 来源于flutter sdk
dev_dependencies:
flutter_test:
sdk: flutter
flutter_driver:
sdk: flutter

Hosted

A hosted package is one that can be downloaded from pub.dartlang.org (or another HTTP server that speaks the same API).

pub

dependencies:
transmogrify: ^1.4.0

自己的服务器

dependencies:
transmogrify: ^1.4.0
transmogrify:
hosted:
name: transmogrify
url: http://your-package-server.com
version: ^1.4.0

Git

dependencies:
kittens:
git: git://github.com/munificent/kittens.git

指定分支

dependencies:
kittens:
url: git://github.com/munificent/kittens.git
ref: some-branch

pub 默认包目录在 git 仓库的根目录,如果要指定在别的位置,可以用 path 参数

dependencies:
kittens:
git:
url: git://github.com/munificent/cats.git
path: path/to/kittens

本地路径

特别适用在一个人同时开发项目和依赖库的情况。因为修改依赖库的代码,在项目中就可以即时生效,有利于调试和提高效率。

dependencies:
transmogrify:
path: /Users/me/transmogrify # 也可以相对路径,相对路径以 pubspec.yml 文件为基准

依赖的分类

直接依赖和传递依赖

根据依赖与项目的关系,可以分为以下2类:

  • immediate dependency :项目中直接使用的依赖,即我们在 pubspec 中列出的依赖,包括 dependciesdev_dependencies
  • transitive dependency :直接依赖所需的依赖, pub 会根据 pubspec 中列出的依赖自动为我们获取。

举个例子

比如我们项目依赖 A ,而 A 又依赖 BB 又依赖 C 。那么 A 是我们项目的immediate dependency, BC 就是transitive dependency

我们可以在命令行中输入命令flutter packages pub deps,查看项目的依赖树。 比如我们在项目中引入了一个支持网络缓存的图片库cached_network_image: ^0.5.0+1

flutter packages pub deps
Dart SDK 2.1.0-dev.9.4.flutter-f9ebf21297
Flutter SDK 1.0.1-pre.2
your_app_name 2.2.0+10 # 项目名称和版本
|-- cached_network_image 0.5.1 # 直接依赖
| |-- flutter… # 直接依赖(因为在项目pubspec中也添加了)
| '-- flutter_cache_manager 0.2.0+1 # 传递依赖
| |-- flutter…
| |-- http…
| |-- path_provider…
| |-- shared_preferences…
| |-- synchronized 1.5.3
| '-- uuid 1.0.3
| |-- convert…
| '-- crypto…

常规依赖和dev依赖

根据依赖的作用范围,可以分为:

  • dependencies :常规依赖
  • dev dependencies :开发时所需依赖。它和常规依赖的区别是,项目依赖库中的 dev dependencies ,对于你的项目来说是不可见的。

举个例子

项目的 pubspec.yml 如下。如果 A 有一个 dev_dependencies 依赖 dev_C ,项目最终的依赖是 A , dev_B;不包括 dev_C

dependencies:
A:
dev_dependencies:
dev_B:

适应场景:如果你需要 importlib 或者 bin 目录,那么选择 dependencies ; 如果你只需要 importtestexample 等,那么就选择 dev dependencies 。使用 dev dependencies 的好处是能让依赖树更小,从而使 pub 运行更快,能跟容易找到满足所有约束的包版本。

包管理

在获取一个新的依赖时,pub 会下载满足版本条件的_最新版本_,然后把版本信息添加到一个 lockfile 中。这个 lockfile 文件叫 pubspec.lock ,位于项目 pubspec.yml 的同级目录。它列出了项目的每个依赖(包括直接依赖和传递依赖)的版本信息。我们应该把这个 lockfile 添加到版本控制中,这样不论开发环境,生产环境都能确保使用了相同的依赖版本。

举个例子

项目的 pubspec.yml 文件包含如下依赖


dependencies:
flutter:
sdk: flutter
cached_network_image: ^0.5.0+1

dev_dependencies:
flutter_test:
sdk: flutter

结合上面提到知识,我们来看看 pubspec.lock 的内容。 lockfile 把所有依赖树打平,并根据首字母排序

cached_network_image:
dependency: “direct main” # 直接依赖,常规依赖
description:
name: cached_network_image
url: “https://pub.flutter-io.cn”
source: hosted
version: “0.5.1”
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

资源分享

一线互联网面试专题

379页的Android进阶知识大全

379页的Android进阶知识大全

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2020年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2020年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值