[译]Building WhatsApp UI with Flutter Io and Dart

原文地址

Flutter是谷歌推出的一款全新的移动app SDK。它旨在帮助开发人员和设计师为Android和IOS开发现代应用程序。

在本系列中,我们将构建流行的即时通讯应用WhatsApp的UI

开始

首先,我们使用方便的CLI创建一个新的Flutter项目。

`$ flutter create whatsapp_ui_clone`

他将生成Android和IOS的项目文件

现在项目已生成,cd进入项目文件夹并运行Flutter run

$cd whatsapp_ui_clone &&  Flutter run`

默认情况下,Flutter会生成一个Counter应用程序,因此如果一切顺利,您应该在设备上看到这一点。


现在应用程序正在运行,让我们导航到lib文件夹并打开main.dart。 在这里,您可以看到默认应用程序的代码。 我们将删除所有内容,以便我们留下一个空白文件。

让我们首先导入flutter的material package。 此软件包包含一组按照Google的material design guidelines的预制小部件。

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

很好! 随着包导入,我们现在转到 main 函数。 应用程序启动时将会走这里。

在 main.dart, 添加

```

void main(){

}

```

接下来,我们在main中指定runApp方法

```

void main(){

runApp(

);

}

```

可以为小部件MaterialApp分配一些属性。 出于我们的目的,我们只会使用home,theme和title。 修改现有代码,使其看起来像这样。

```

void main() {

runApp(

new MaterialApp(

home: new WhatsAppUiClone(),                                //new 

title: 'WhatsApp',                                          // new 

theme: new ThemeData(                                        //new

primaryColor: new Color(0xff075E54),                      //new

accentColor: new Color(0xff25D366),                        //new

),

));

}

```

上面的代码为我们的应用程序设置了一些属性。 Title为应用程序提供了标题,home为其分配了一个主页,theme设置了一些全局样式规则。

是时候创建WhatsAppUiClone类了。 在main方法下,我们创建一个名为WhatsAppUiClone的新类,并让它扩展StatefulWidget。

```

class WhatsAppUiClone extends StatefulWidget {

_WhatsAppUiClone createState() => new _WhatsAppUiClone();

}

class _WhatsAppUiClone extends State {

@override

Widget build(BuildContext context) {

return new Scaffold(

);

}

}

```

在Flutter中,有两种类型的小部件,有状态和无状态。 上面的代码使用Stateful变体。 如您所见,它分三步创建。 首先,在第1行,定义类名,然后是关键字Extends StatefulWidget。 然后在第二行,创建状态。 最后,在第五行创建另一个类,这次使用用于创建状态的名称。 这个类扩展了State。

我们现在可以开始创建appBar了。 在_WhatsAppUiClone中,添加以下行

```

class _WhatsAppUiClone extends State with SingleTickerProviderStateMixin { //modified

TabController _tabcontroller; //new 

@override

Widget build(BuildContext context) {

return new Scaffold(                                                           

appBar: new AppBar(                                                     

backgroundColor: Theme.of(context).primaryColor,   

title: new Text('WhatsApp'),                                       

elevation: 0.7,                                                         

bottom: new TabBar(

controller: _tabcontroller,

indicatorColor: Colors.white,

tabs: [

new Tab(icon: new Icon(Icons.camera_alt)),

new Tab(text: 'CHATS',),

new Tab(text: 'STATUS',),

new Tab(text: 'CALLS',)

],

),

),

);

}

}

```

太棒了! 只需几行代码,稍作修改,我们就创建了一个带有底部导航标签的素材应用栏。 该类被修改为包含SingleTickerProviderStateMixin,它是TabBar使用的动画属性。 接下来,我们返回了一个新的Scaffold,它是材料包中的一个小部件。 Scaffold为我们的应用程序添加不同的API,如AppBar,Tabs,Drawer等...要了解更多信息,请参阅https://docs.flutter.io/flutter/material/Scaffold-class.html。

在Scaffold内部,我们使用appBar属性来创建AppBar。 然后将背景颜色设置为之前在MaterialApp小部件的theme属性中定义的主要颜色。 作为appBar的一部分,我们使用bottom属性来创建TabBar。 TabBar包含一些属性,例如指示器颜色,我们也定义了控制器、Tab类型的小部件,选项卡将采用数组。 这里设置了四个选项卡。

有了这个,我们就可以创建不同的页面了。 现在,我们将创建一个显示一些文本的小部件。 在我们的lib文件夹中,创建一个名为pages的新文件夹。 在页面内部,我们创建了四个名为call_history.dart,camera_page.dart,chat_screen.dart和status_page.dart。 这些文件将是不同的tab主体。

对于call_history,我们添加以下行

```

import 'package:flutter/material.dart';

class CallHistory extends StatelessWidget {

@override

Widget build(BuildContext context){

return new Container(

child: new Center(

child: new Text('Time to make history...', style: new TextStyle(fontSize: 20.0),),

)

);

}

}

```

在camera_page中我们添加

```

import 'package:flutter/material.dart';

class CameraPage extends StatelessWidget {

@override

Widget build(BuildContext context){

return new Container(

child: new Center(

child: new Text('Camera Here!  ', style: new TextStyle(fontSize: 20.0),),

)

);

}

}

```

对于 chat_screen

```

import 'package:flutter/material.dart';

class ChatScreen extends StatelessWidget {

@override

Widget build(BuildContext context){

return new Container(

child: new Center(

child: new Text('Red Squadron report in... ', style: new TextStyle(fontSize: 20.0),),

)

);

}

}

```

最后是status_page

```

import 'package:flutter/material.dart';

class StatusScreen extends StatelessWidget {

@override

Widget build(BuildContext context){

return new Container(

child: new Center(

child: new Text('Red Five reporting...', style: new TextStyle(fontSize: 20.0),),

)

);

}

}

```

有了所有组件,就可以连接并查看结果了。 回到main.dart,修改文件使其看起来像这样

```

import 'package:flutter/material.dart';

import './pages/camera_page.dart' ; //new

import './pages/chat_screen.dart' ;  //new

import './pages/status_page.dart' ; //new

import './pages/call_history.dart' ;  //new

void main() {

runApp(

new MaterialApp(

home: new WhatsAppUiClone(),

title: 'WhatsApp',

theme: new ThemeData(

primaryColor: new Color(0xff075E54),

accentColor: new Color(0xff25D366),

),

));

}

class WhatsAppUiClone extends StatefulWidget {

_WhatsAppUiClone createState() => new _WhatsAppUiClone();

}

class _WhatsAppUiClone extends State  with SingleTickerProviderStateMixin {

TabController _tabcontroller;

//new

@override

void initState() {

super.initState();

_tabcontroller = new TabController(

vsync: this,

length: 4,

);

}

//new

@override

void dispose() {

super.dispose();

_tabcontroller.dispose();

}

@override

Widget build(BuildContext context) {

return new Scaffold(

appBar: new AppBar(

backgroundColor: Theme.of(context).primaryColor,

title: new Text('WhatsApp'),

elevation: 0.7,

bottom: new TabBar(

controller: _tabcontroller,

indicatorColor: Colors.white,

tabs: [

new Tab(icon: new Icon(Icons.camera_alt)),

new Tab(text: 'CHATS',),

new Tab(text: 'STATUS',),

new Tab(text: 'CALLS',)

],

),

),

//new

body: new TabBarView(

controller: _tabcontroller,

children: [

new CameraPage(),

new ChatScreen(),

new StatusScreen(),

new CallHistory()

],

),

);

}

}

```

从顶部开始向下工作,我们将刚创建的四个文件导入main.dart。 接下来,我们覆盖Flutter的两个生命周期方法。 在initState方法中,我们将之前创建的_tabcontroller设置为新的TabController。 选项卡的数量在此处设置。 向下移动,我们再次覆盖生命周期方法,这次是dispose。 最后,在Scaffold中,我们使用body属性并将其设置为新的TabBarView。 TabBarView使用与以前相同的控制器,并将我们创建的四个不同的类作为其子项。

Building a WhatsApp视频地址


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

推荐阅读更多精彩内容