Flutter经验

[toc]

安装flutter环境

参考 flutter中文网站官方文档

flutter命令

检测flutter版本

flutter doctor -v

新建flutter项目

flutter create project_name

新建dart包

flutter create --template=package package_name

包含 :
lib/package_name.dart:Package的Dart代码
test/package_name_test.dart:Package的单元测试代码。

新建flutter插件

flutter create --org com.baidu.www --template=plugin -i objc -a java flutter_package_app

说明:

  1. --org选项指定组织(反向域名),Android和iOS的标识符
  2. -a指定android语言 java、kotlin(默认)
  3. -i指定iOS语言 objc、swift(默认)

安装所需包

改动 pubspec.yaml 文件后

flutter packages get

flutter pub get

打包 app

iOS

flutter build ios

默认编译的release包,等同于

flutter build ios --release

Android

flutter build apk

调试 app

flutter run
需要安装模拟器或链接真机

清理编译缓存

flutter clean

常用命令:

常用命令 含义
--version 查看Flutter版本
-h或者--help 打印所有命令行用法信息
analyze 分析项目的Dart代码。
build Flutter构建命令。
channel 列表或开关Flutter通道。
clean 删除构建/目录。
config 配置Flutter设置。
create 创建一个新的Flutter项目。
devices 列出所有连接的设备。
doctor 展示了有关安装工具的信息。
drive 为当前项目运行Flutter驱动程序测试。
format 格式一个或多个Dart文件。
fuchsia_reload 在Fuchsia上进行热重载。
help 显示帮助信息的Flutter。
install 在附加设备上安装Flutter应用程序。
logs 显示用于运行Flutter应用程序的日志输出。
packages 命令用于管理Flutter包。
precache 填充了Flutter工具的二进制工件缓存。
run 在附加设备上运行你的Flutter应用程序。
screenshot 从一个连接的设备截图。
stop 停止在附加设备上的Flutter应用。
test 对当前项目的Flutter单元测试。
trace 开始并停止跟踪运行的Flutter应用程序。
upgrade 升级你的Flutter副本。

AS开发Flutter的常用快捷键:

Cmd + Option + L : 代码格式化。
Cmd + “-” 或者 “+” :收起和展开代码。
Cmd + Shift + “-” 或者 “+” : 收起和展开全部代码。
Cmd + Shift + Enter :代码快速补全。
Cmd + F12 :快速查看当前文件所有方法。
Cmd + Shift + F :全局搜索。
Cmd + Shift + R :全局替换。
Cmd + F :当前文件搜索。
Cmd + R :当前文件替换。
Cmd + Option + M :方法抽离或重构。
Cmd + Option + V : 抽离局部变量。
Cmd + Option + F :抽离成员变量。
Cmd + O :全局搜索类/文件/关键字/(包括系统类,自定义类)。
Cmd + Option + W :抽取代码为单独的方法,或者抽取成get方法。
Cmd + Option + E :创建文件,抽取代码为单独的方法,或者抽取成get方法。
Cmd + Option + B :查看抽象类的实现。
Cmd + D :复制单行。
Cmd+ Delete :删除行。
Cmd + \ :热重载(hot reload) 。
Cmd + Option + \ :热重启(hot restart)。
Cmd+ Shift + Enter :if后面自动加(){ }。
Cmd+ J :快速生成模版代码块。
Ctl+ R :运行项目。
Option + Enter :在widget包裹一个新的widget。
Option + Enter :自动修正错误(但是要把光标移动到错误上面)。
Option + Enter :将StatelessWidget转 StatefulWidget。
Option + Up :选择这个widget。
Option + Ctl + O :清除无效包引用。
Option + Ctl + I :自动缩进对齐/代码对齐。
Option + Shift + Up/Down :上下移动代码。
Option + 双击 Up :选择区域。
选中代码 + tab :选中代码缩进。
选中代码 + shift + tab :选中代码缩进。

————————————————

flutter项目结构

项目结构

项目结构如下图所示
[图片上传失败...(image-dc0f10-1650855720458)]

入口文件在 lib - main.dart

资源

Flutter 中 assets 可以是任意类型的文件,而不只是图片.

将 vip.png 放到 images 文件夹中

然后在 pubspec.yaml 中声明 assets:

assets:
 - images/vip.png

在代码中,通过路径访问它:

Image.asset('assets/images/vip.png',

将不同分辨率的图片放到不同的文件夹,可以这样写:先将 icon.png 放入到 images 文件夹中,把其它分辨率图片放入对应的子文件中:

images/icon.png
images/2.0x/icon.png
images/3.0x/icon.png

依赖

添加依赖应该在 pubspec.yaml 中添加,如:

dependencies:
    flutter:
        sdk: flutter
    google_sign_in: ^3.0.3

添加完不要忘记执行 flutter packages get

开发调试

编辑器使用的 Android Studio.

界面调试工具 Flutter Inspector

在 Android Studio 中,对 Flutter 项目,有了很好的扩展工具支持,默认情况下,在Android Studio 开发工具的右侧边栏上有一个 Flutter Inspector 工具,可以快速的定位 UI 代码.
使用方式参考: https://flutterchina.club/inspector/

Flutter 断点调试

定位问题时经常需要进行断点调试,打印调试信息,错误日志等.
参考链接: https://blog.csdn.net/shulianghan/article/details/115333983

代码规范整理

下面是我总结的一些规范和约定,希望可以在开发过程中大家一起遵循,增大代码可读性

Flutter是使用Dart语言开发的。

Dart语言是基于类的纯面向对象语言。

Dart 中的所有东西都是对象,包括数字、函数等,它们都继承自 Object,并且对象的默认值都是 null(包括数字)。

Dart 中类和接口是统一的,类就是接口。

标识符

在 Dart 中标识符有三种风格:

  • 大写驼峰:每个单词的第一个字母大写,包括第一个单词。
  • 小写驼峰:每个单词的第一个字母大写,除了 第一个单词一直小写,即使第一个单词是缩写。
  • 小写加下划线:只使用小写字母,即使是缩写,然后使用下划线_分隔。

包名、文件名使用小写加下线划

一些文件系统是不区分大小写的,所以许多项目要求文件名全小写。使用分隔符使得那种方式下名字仍然可读。使用下划线作为分隔符确保名字仍然是有效的 Dart 标识符。

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

导入别名使用小写加下划线

当导入包时, 如果涉及到别名 as, 一律使用小写+下划线方式

import 'dart:math' as math;
import 'package:english_words/english_words.dart' as ew;

类型名使用大写驼峰

类,枚举,自定义类型和参数类型,应该使用大写驼峰,且不能使用分隔符。

class SliderMenu { ... }
class HttpRequest { ... }
typedef bool Predicate<T>(T value);

甚至包括作为元数据注解的类。

class Foo {const Foo([arg]);}
@Foo(anArg)class A { ... }
@Foo()class B { ... }

其它标识符使用小写驼峰

类成员,顶级的定义,变量,参数,命名参数使用小写驼峰。

var item;
HttpRequest httpRequest;
void align(bool clearItems) {// ...}

常量名称

建议使用小写驼峰式命名

const pi = 3.14;
const defaultTimeout = 1000;
final urlScheme = new RegExp('^([a-z]+):');
class Dice {static final numberGenerator = new Random();}

缩写相关

大写首字母缩略词有点难以阅读,并且多个相邻的缩写可能导致模棱两可的名字。例如,一个以HTTPSFTP开始的名字,没有办法判断提及的是HTTPS FTP还是HTTP SFTP。
为了避免这种情况,除了两个字母的首字母缩略词以及缩写词,其它的还是像常规单词那样首字母大写。(两个字母的缩写词,像 ID 和 Mr. 仍然首字母大写。)

HttpConnectionInfo
uiHandler
IOStream
HttpRequest
Id
DB

规定代码的顺序

为了保持文件的整洁,我们规定指令出现的顺序。每个部分应该使用空行隔开。

在其它导入之前导入 “dart:”

import 'dart:async';
import 'dart:html';
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';

在相对导入之前导入 “package:”

import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'util.dart';

在其它导入前导入第三方 “package:”

import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'package:my_package/util.dart';

在所有导入之后的单独部分指定导出

import 'src/error.dart';
import 'src/foo_bar.dart';
export 'src/error.dart';

注释

Dart的文档注释除了有 /** /外 ,还有 /// 。三斜杠一般单行文档注释使用,多行时每行有个三斜杠效果和/* */ 一样。

  1. 推荐使用///作为注释。
  2. Dart的文档注释中可以有markdown的标记语法
  3. 文件头统一注释模板

/// @desp:
/// @time ${DATE} TIME
/// @author: {USER}

/// 主要用于文档注释来注释成员和类型。// 主要用于方法体内的注释

///item 点击
void _itemClick() {
  
_btnClick() {
  return () {
    //开始请求网络,显示提交框
    LcfarmUtil.showSubmitDialog(context);
    UserService.passwordVerify(_password, (data) {
      //成功回调
      //隐藏提交对话框
     
      Navigator.of(context).pop();

      LogUtil.v("登录成功");

      //进入修改密码页-静态路由表
      Navigator.pushNamed(context, Router.passwordUpdate,
          arguments: {"phone": "138****8175"});
    }, (HttpError error) {
      //失败回调
      //隐藏提交对话框
      Navigator.of(context).pop();
      LcfarmUtil.showTipDialog(context, error.message);
    });
  };
}

约定

  1. 函数体代码不宜过多,最好在20 - 30行以内 过多改用调用 一个方法中尽量只做一件事
  2. flutter嵌套层数最好3以内 改为调用
  3. 入参过多(4个以上),建议封类型
  4. 函数参数定义要写参数类型
  5. 加下划线代表private
  6. 不使用 new 创建(官方)
  7. if格式定死 条件判断请写好注释 不要嵌套太多的逻辑判断 不能超过3层

if (true) {
// aa
} else {
// bb
}

这样避免了else 悬挂的问题。

if (isWeekDay) {
print('Bike to work!');
} else {
print('Go dancing or read a book!');
}

  1. 统一使用 Android Studio 编辑器来格式化代码,快捷键Ctrl+Alt+L.
  2. 避免一行的长度超过 80 个字符

flutter 资料

flutter中文网

Dart语言开发文档

咸鱼技术-简书

Flutter超全开源框架、项目和学习资料汇总

Material 还是 Cupertino?

flutter开源项目

flutter中国开源项目

flutter + getx 参考项目

好用的三方flutter库

状态管理器,路由管理

get

网络请求框架

dio

网络连接状态监测

connectivity_plus

播放器

fijkplayer

动画库

lottie

辅助工具,帮助生成与原生交互插件模板

pigeon

透明占位图

transparent_image

获取设备信息

device_info_plus

线程同步

synchronized

本地数据存储

mmkv

瀑布流控件

flutter_staggered_grid_view

图片展示库

extended_image

屏幕常亮

wakelock

Toast提示

fluttertoast

应用内分享

share_extend

轮播图组件

flutter_swiper

Flutter上拉刷新,下拉加载框架

pull_to_refresh

加载动画库

flutter_spinkit

格式化日期时间组件

date_format

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容