本文作者为 360 奇舞团前端开发工程师
可以按照flutter 官网搭建下相应的环境,这里大概讲解下用 fvm 搭建 flutter 环境。
安装fvm
# 使用 brew 安装
brew tap leoafarias/fvm
brew install fvm
# 使用 pub package 安装
dart pub global activate fvm
安装成功后命令行里会给出 fvm 目前安装路径 $PATH":"$HOME/.pub-cache/bin"
配置
# .bash_profile 中添加
export PATH = "$PATH":"$HOME/.pub-cache/bin"
# 使.bash_profile 生效
source .bash_profile
# 执行 fvm 命令,看是否出现相关 help
fvm 相关命令
配置 fvm 缓存路径fvm config --cache-path
查看当前安装的版本fvm list
安装指定版本的 flutterfvm install version
删除指定版本的 flutterfvm remove version
指定当前使用哪个版本fvm use version
ps:切换 flutter 版本后需要敲下 fvm flutter doctor
。因为每个版本不一样,所以可能需要重新下载运行环境
安装
brew tap dart-lang/dartbrew install dart
更新
brew upgrade dart
重新安装
brew reinstall dart
fvm flutter create flutter_painter
cd flutter_painter
fvm flutter run
输入fvm flutter run
后控制台会提示想选择用哪种设备进行调试,也可以使用flutter devices
直接查询设备,flutter run -d all
在所有设备上运行项目,我这里选择了用 web chrome 打开项目fvm flutter run -d Chrome
。或者 mac 有 Xcode 的话,使用命令open -a Simulator
可以直接打开 iOS 模拟器,然后执行flutter run
,在执行前确保没有其他模拟器正在运行,这样项目就可以直接运行在 ios 模拟器上。
CustomPainter, 跟canvas一样,在 flutter 里我们可以用这个类绘制各种自定义图形。在这个类里我们需要实现 paint() 绘制方法与 shouldRepaint() 判断刷新布局的时是否需要重绘。
class SimplePainter extends CustomPainter {@overridevoid paint(Canvas canvas, Size size) {// 绘制代码Paint paint = Paint()..color = Colors.black..style = PaintingStyle.stroke..strokeWidth = 5.0;Path path = Path();// 对路径进行相关操纵...path.close();canvas.drawPath(path, paint);}@overridebool shouldRepaint(CustomPainter oldDelegate) {return true}
}
具体的绘制由 canvas 画布和 paint 画笔来实现的。
canvas 相关方法:
方法 | 功能 |
---|---|
drawLine() | 画直线 |
drawCircle() | 画圆 |
drawOval() | 画椭圆 |
drawRect() | 画矩形 |
drawPoints() | 画点 |
drawArc() | 画圆弧 |
Paint 类参数:
属性名 | 类型 | 参考值 | 功能 |
---|---|---|---|
color | Colors | Colors.black | 画笔颜色 |
strokeWidth | double | 5.0 | 画笔粗细 |
strokeCap | StrokeCap | StrokeCap.round | 画笔笔触类型 |
isAntiAlias | bool | true | 是否启动抗锯齿 |
path 对象是需要绘制的元素集合,相关方法:
方法 | 功能 |
---|---|
moveTo() | 绘制的起点移到指定位置 |
lineTo() | 从起点绘制一条直线到指定位置 |
quadraticBezierTo() | 绘制二阶贝塞尔曲线 |
addRect() | 画矩形 |
addOval() | 画椭圆 |
import 'package:flutter/material.dart';void main() {runApp(const MaterialApp(title: '画板', home: SafeArea(child: CanvasPage())));
}class CanvasPage extends StatefulWidget {const CanvasPage({Key? key}) : super(key: key);@overrideState createState() => _CanvasPageState();
}class _CanvasPageState extends State {Path path = Path();@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('画板')),body: Listener(// 落下onPointerDown: (e) {path.moveTo(e.localPosition.dx, e.localPosition.dy);setState(() {});},// 移动onPointerMove: (e) {path.lineTo(e.localPosition.dx, e.localPosition.dy);setState(() {});},// 离开onPointerUp: (e) {path.moveTo(e.localPosition.dx, e.localPosition.dy);path.close();setState(() {});},child: CustomPaint(foregroundPainter: CanvasPaint(path: path), child: Container(color: Colors.transparent))),);}
}class CanvasPaint extends CustomPainter {Path? path;Color? color; // 画笔颜色double? width;CanvasPaint({required this.path, this.color = Colors.black, this.width = 5});@overridevoid paint(Canvas canvas, Size size) {Paint paint = Paint()..color = color!..strokeWidth = width!..strokeCap = StrokeCap.round..style = PaintingStyle.stroke;canvas.drawPath(path!, paint);}// 是否需要重新绘制@overridebool shouldRepaint(covariant CanvasPaint oldDelegate) {// return oldDelegate.path != path;return true;}
}
找到 web/index.html 文件并删除所有 标记:
在下插入
标签
设置扩展程序尺寸,在 html
标签内添加宽高
在manifest.json
中更改配置
{"name": "flutter_painter_plugin","short_name": "flutter_painter_plugin","version": "1.0.0","content_security_policy": {"extension_pages": "script-src 'self'; object-src 'self'"},"action": {"default_popup": "index.html","default_icon": "icons/Icon-192.png"},"manifest_version": 3
}
构建拓展程序,需要满足 csp
限制,生成的文件在build/web
文件夹下
fvm flutter build web --web-renderer html --csp
运行拓展程序
(1)打开谷歌扩展程序页面
chrome://extensions/
(2) 选择开发者模式,选中加载已解压的扩展程序
(3) 选择
build/web
文件夹,就可以看到新的扩展程序
谷歌扩展程序文档
flutter 文档
- END -
奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。