Flutter 使用报告
Flutter 介绍
Flutter 是 Google 推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开发 App,一套代码同时运行在 iOS 和 Android 平台。Flutter 提供了丰富的组件、接口,开发者可以很快地为 Flutter 添加 Native 扩展。
在此记录些常用资料:
文档 | 文章 |
---|---|
官方网站 | Flutter 最佳实践和编码准则 |
官方英文文档 | iPad 大屏 & Flutter 多引擎适配之路 |
官方中文文档 | 详解 android:elevation 的使用 |
官方 Package 站 | Flutter elevation 属性名称的含义 |
Flutter 实战 | Android 中 elevation 的设置方法 |
模式匹配 |
使用 index.dart 文件简化导入
在 lib/index.dart
内 export
所有子文件夹下的 index.dart
文件,其 export
该文件夹下非自身的所有 *.dart
文件。
在所有 *.dart
文件,包括 main.dart
,内尽绝大可能 import 'package:<项目名>/index.dart';
即可简化导入。
同时当要引入外部包时,只要在 lib/index.dart
文件内导入即可,当然,有时会出现不同包之间的类名冲突,此时在需要使用到该包的地方单独 import
即可,或者使用 hide
或 show
语法限制,具体例子如下:
/// 各路由下的 index.dart
export 'main.dart';
export 'pages/index.dart';
export 'widgets/index.dart';
/// flutter 相关
/// [RefreshCallback] 和 `export 'package:flutter/material.dart'` 冲突,两者近似
export 'package:flutter/cupertino.dart' hide RefreshCallback;
export 'package:flutter/services.dart'
show DeviceOrientation, SystemChrome; // 设备服务
/// [Badge] 和 `export 'package:badges/badges.dart'; // 小红点提示` 冲突,我想用外部包
export 'package:flutter/material.dart' hide Badge;
export 'package:flutter/gestures.dart';
/// dart 相关
export 'dart:async' show Timer, StreamSubscription;
export 'dart:convert';
export 'dart:io';
export 'dart:ui' show ImageFilter;
/// 外部包相关
export 'package:badges/badges.dart'; // 小红点提示
/// [Interval] 和 `package:flutter/src/animation/curves.dart` 冲突,两者结构完全不同,但外部包里的这个用不到
export 'package:dart_date/dart_date.dart' hide Interval; // 日期工具
/// [Text] 和 `export 'package:flutter/material.dart` 冲突,两者结构完全不同,但外部包里的这个用不到
export 'package:flutter_quill/flutter_quill.dart' hide Text; // 富文本
版本号构建问题
Flutter 使用 android/app/build.gradle
来打包 APK, 且其引入了 flutter.gradle
并指向 flutter.groovy
。
约在 flutter.groovy
的 993
行:
if (shouldSplitPerAbi()) {
variant.outputs.each { output ->
def abiVersionCode = ABI_VERSION.get(output.getFilter(OutputFile.ABI))
if (abiVersionCode != null) {
output.versionCodeOverride =
abiVersionCode * 1000 + variant.versionCode
}
}
}
我们知道 Flutter 将判断是否使用了 'split-per-abi'
的 Flag, 是则在 ABI_VERSION
选择一个版本 * 1000
再加上构建号。官方解释见 此链接。
我们只需修改 ABI_VERSION map
如下:
private static final Map ABI_VERSION = [
(ARCH_ARM32) : 0,
(ARCH_ARM64) : 0,
(ARCH_X86) : 0,
(ARCH_X86_64) : 0,
]
注意若进行了 Flutter 版本更新,应重新修改该 flutter.groovy
文件
Vivo 系手机无法调试 Flutter 程序
Vivo 系列手机升至 Origin3 后发现调试 Flutter 应用卡在启动页,并且没有任何报错,详见 Github Issue,简化自 此链接。
答案是 Vivo 发大病连日志都隐藏,我们需要提供 IMEI 1
码至 Vivo 官方进行授权
- 拨号盘输入
*#06#
复制IMEI 1
值 - 添加企业 QQ 号 3002261823 或通过 官方网站 联系
- 提交相关问题和信息,要求一键授权自己的手机
- 等待授权成功后拨号盘输入
*#*#112#*#*
,右上角按钮 > 更多 > 一键授权
即可
AlertDialog
的 content
传入 ListView
时在调试模式下报错
这是个怪问题,release 版本正常运行,解决方法如下:
AlertDialog(
title: (...),
content: SizedBox(
width: double.minPositive, // 可选 double.maxFinite 但建议为 double.minPositive,
child: ListView(
shrinkWrap: true,
children: (...),
),
),
contentPadding: (...),
actions: (...),
);
Ard 语法
详见 此页面。
感想
- Flutter 的使用非常简单,上手也快,非常有意思。
- 自己用 Flutter 写了很多项目,这里来个 Mercurius 日记软件的 仓库链接。