Flutter项目开发经验总结

环境搭建和基本概念

  Flutter作为谷歌开发的一款跨平台语言越来越普遍的被运用在各种大型项目上,作为一名iOS开发人员也要实时关注这些。早期虽研究过语法方面的问题,但是由于没有具体的项目也就流于表面。近期新的项目采用Flutter语言进行开发,也算是一次实践,在开发的过程中也踩了不少坑,所以想写一篇文章进行记录和分享。

1. Flutter安装和环境配置

  博主是使用Mac开发,其它开发环境可参考对应文档。具体的安装和环境配置可参考Flutter中文官网 在macOS上搭建Flutter开发环境

2.关于Flutter语法

  Flutter采用Dart语言进行开发,Dart语言具体的语法可查询相关文档。本文章只介绍Flutter开发过程中一些基本概念

  • 组件 Widget :Flutter中使用最多的概念是组件,在Flutter中一切皆是组件,以下我已对比的方式对一些常用的组件进行简单的说明,由于我是iOS开发,便已iOS控件为标准进行对比:
Flutter组件 iOS控件 说明
Container View 一个拥有绘制、定位、调整大小的 widget。
StatelessWidget StatelessWidget一般用于用于和Class类型结合使用,由StatelessWidget限定说明该类的属性在初始化时就是静态的
StatefulWidget 一个和StateLessWidget一样常用的组件,区别在与StatefulWidget可以保存一些状态信息,用于实现页面间的动态变化
Column 列,在列中的组件以从上到下的方式布局
Row 行,在行中的组件以从左到右的方式布局
ListView ScrollView 滚动列表,ListView只是其中一种
Text 对应文本属性 文本属性设置
FlatButton UIButton 按钮,Flutter中按钮组件很多,这里只列出一种常用的作为对比
Appbar UINavigationBar 导航栏,注意不是导航控制器。可以设置文字,导航按钮等信息
Scaffold Material Design布局结构的基本实现。可以在其中设置各种控制器,具体参考API。可以认为是最基本的一个容器组件
MaterialApp MaterialApp是一个方便的Widget,它封装了应用程序实现Material Design所需要的一些Widget

需要注意的是Flutter组件中只有Container具有大小,定位等一些列属性,如果你想为其它组件设置固定的尺寸,那么在外面要包含一层Container

  • 布局:Flutter中布局的构建和原生相比个人觉得有些复杂,由于Flutter中只有Container组件有尺寸和位置的概念,所以很多简单的布局相较于原生看起来有些怪异,官网提供了一个布局教程可以很方便的理解这些概念。
  • 导航:一个完整的APP必定涉及到页面跳转,对于iOS原生来说我们用UINavigationController导航控制器来控制页面间的跳转,在Flutter中 Navigator起到界面导航的作用。
     flutter中跳转界面有两种方式,一种是通过路由的方式跳转,通过这种方式被称之为静态跳转。静态跳转一般不涉及到传递参数,静态跳转也可以传递参数,只是比较麻烦,这里就不介绍了。以下为创建静态路由的代码:
routes: <String, WidgetBuilder>{
        '/Login': (BuildContext context) => new LoginPage(),
        '/Home': (BuildContext context) => new MainPage(),
        '/a': (BuildContext context) => new MyPage(title: 'page A'),
        '/b': (BuildContext context) => new MyPage(title: 'page B'),
      },

routes是MaterialApp组件下的一个属性,用于设置整个路由表。严格来说静态路由是可以设置参数的,比如MyPage(title: 'page A')中指定了MyPage界面中导航的标题为page A,只是这些参数在设置完后就不能更改。以下是通过静态方式跳转页面的API和代码说明

 //跳转到某个界面
 Navigator.pushNamed(context, '/Login');
//跳转到某个界面
//用跳转的界面替换当前界面
Navigator.pushReplacementNamed(context, '/Login');
 //跳转到某个页面并移除
 //移除当前界面
 Navigator.pushNamedAndRemoveUntil(
        context, '/Login',
            (Route route) => route == null);
 //移除所有界面
 Navigator.pushNamedAndRemoveUntil(
        context, '/Login',
            (Route route) =>  false);

动态界面跳转

//跳转到某个界面
Navigator.push(
        context,
        MaterialPageRoute(builder: (_) => LoginPage()));
 //跳转到某个界面
 //用跳转的界面替换当前界面
 Navigator.pushReplacement(
        context,
        MaterialPageRoute(builder: (_) => LoginPage()));
//跳转到某个页面并移除
//移除当前界面
Navigator.pushAndRemoveUntil(
        context,
        MaterialPageRoute(
            builder: (_) => LoginPage()),
            (Route route) => route == null);
//移除所有界面
Navigator.pushAndRemoveUntil(
        context,
        MaterialPageRoute(
            builder: (_) => LoginPage()),
            (Route route) => false);

以上介绍的是由A界面跳转到B界面的方法和参数,下面是一些回退界面的方法和说明:

//返回上个界面
 Navigator.pop(context);
//先返回到上个界面,然后在跳转到指定界面
 Navigator.popAndPushNamed(context, pageName);
//返回到某个界面
Navigator.popUntil(context, ModalRoute.withName(pageName));

这里有一个注意的点在于回退到具体某个界面时需要指定界面的路由名称,然而通过动态跳转方式时是没有名称的,所以可以通过以下方式在跳转时为界面指定路由名称

Navigator.push(
                    context,
                    MaterialPageRoute(
                      settings: RouteSettings(name: "Foo"),
                        builder: (_) => HomePage(),
                    )
                );

上诉代码中settings中name属性就是HomePage界面的路由名称

  • 底部导航栏:一个完整的App一般都是有多个模块组成,iOS原生采用TabBarController实现模块划分功能,而flutter则采用BottomNavigationBar实现同样的效果,对于该组件没有特别需要注意的点,只需要对照API即可

这篇文章只是简单介绍下flutter,后续还会对开发过程中踩过坑进行总结。由于本人也是刚接触不久,所以难免有错误和不足。有理解错误或者不足的地方希望大家谅解和指正

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • Google 出品,Dart语言,Flutter Engine引擎,响应式设计模式,原生渲染。 目录 1. 什么是...
    兰朋友_阅读 4,687评论 0 3
  • 万事皆 Widget Widget 是每个 Flutter 应用的基础。每个 Widget 是一部分用户界面上不可...
    三季人阅读 1,668评论 1 2
  • 简书7个月,收获粉丝600,其中前4个半月仅收获粉丝150,后期持续发力。现在每个月以200的速度增长。两个月后,...
    魏小强阅读 640评论 6 25
  • 蓝牙数据传输问题 对于蓝牙来说google已经封装好了很多api所以使用起来并不会很难,但是实际开发中蓝牙开发最头...
    林锐波阅读 1,552评论 0 6
  • 从遇到你的那天 我感到再也遇不上你 哪怕,我历尽艰辛 跑遍所有大路和羊肠小道 用半生 寻遍坎坷,穷苦,繁华 直至呼...
    海心沉思之花阅读 320评论 0 1