flutter基礎(chǔ)-看完這篇就可以擼app了

這篇內(nèi)容純干貨,手把手一步一步展示,從零到一個完整的app的構(gòu)建。

上一篇文章已經(jīng)教大家怎么搭建flutter的環(huán)境:傳送門

http://www.itdecent.cn/p/a1344cfea21d

首先看一下我們的我們今天的demo構(gòu)建出來的是啥樣子的



這篇文章我們要講的東東有

a. layout結(jié)構(gòu)

b. navBar?

c. tabbar和列表組件的使用

d.?http請求JSON數(shù)據(jù),并渲染到列表

e. 組件之間的通信

?f.? 路由(帶參數(shù)路由)


廢話不多說,直接開干

首先,flutter的一個強(qiáng)大的特性就是其炫酷霸氣的UI庫,官方傳送門:Material-UI庫

http://www.material-ui.com/#/

在這里大家就可以任意選擇自己喜歡的UI組件了。


navBar

首先做這個demo,我們要來拆分有哪些結(jié)構(gòu)

1. 肯定有個底部導(dǎo)航欄

2. 我們底部導(dǎo)航欄分別要對應(yīng)的界面(假設(shè)3張)

ok, 那我們先建立這些dart文件,并命名, 分別為第一個界面,第二個界面,第三個界面

接下來,我們給每一個tab子界面,加入簡單的代碼結(jié)構(gòu),? 渲染出來就是這樣的效果

其中 scaffold是一個腳手架,可以就理解為一個html,appBar就是上面的那個titlebar,body就不用說了吧

有了這3個界面,我們就可以回到main.dart中,去加入一個底部導(dǎo)航,并且把他們都關(guān)聯(lián)起來!

首先我們要將這3個tab界面引入到我們的父組件,就是main.dart中,像這樣


引入組件

然后,我們來改造我們的main下面的widget, 像這樣

其中TabController 就是tabbar的控制器,

然后我們在initState()初始化的時候,注意那個length屬性,就是表示有幾個tab,剩下的就不用管了,當(dāng)走流程吧。

然后就是在首頁的Scaffold中去加入一個bottomNavigationBar, 這個大家一看都懂是啥,?底部導(dǎo)航欄

然后在child里面new一個TabBar出來,TabBar中的tabs屬性里面包含了一個Tab widget數(shù)組,每個Tab就是對應(yīng)的下面的圖標(biāo)和文案, controller就是控制器了,應(yīng)該都很好理解吧。

body:就是一個TabBarView widget, 里面的屬性和TabBar widget都是對應(yīng)著來的。

還有記得加入?SingleTickerProviderStateMixin, 記住就好,不要深究。

然后flutter run 跑起來,就實(shí)現(xiàn)了一個簡單的底部導(dǎo)航了。

注:這里沒有使用appBar屬性,因?yàn)樵趖ab子組件中定義了,這里添加了就會生成2個appbar了。


現(xiàn)在我們要在子組件中加入一個list組件

我們就集中放在firstPage里吧。

我們把列表定義為一個木偶組件,那我們就把他放進(jìn)components里面,代碼和效果如下:

main.dart
components/list.dart

布局layout

在這里我們就要說一下layout了.

先放官方傳送門:flutter layout widget

可以大致分為2類:

1. Single-child layout widgets;父級widget中只能包含唯一一個子級widget

主要有: Contrainer、Padding、Center等等

2. Multi-child layout widgets;父級widget中能包含多個子級widget

主要有: Row、Column等等

一個官方的實(shí)例,就可以很明白的展示一個比較復(fù)雜的布局

layout實(shí)例

說白了,layout的方式就是一層一層的搭積木,和H5的基本一樣,一層一層的往里面寫,multi-child layout widget 默認(rèn)支持flex布局,可以通過mainAxisAlignment(主軸屬性)和?crossAxisAlignment(垂直軸屬性)來進(jìn)行flex布局。

mainAxisAlignment: MainAxisAlignment.spaceBetween

crossAxisAlignment: CrossAxisAlignment.center。

到此為止,我們就得到一個列表,接下來我們就要通過http請求接口,將返回的JSON數(shù)據(jù)綁定到我們的列表上去。

http請求

dart提供了io庫

dart:io

類型轉(zhuǎn)換庫

dart:convert

http get請求

注:由于版本的跟新,其中代碼有如下改動:

UTF8.decoder => utf8.decoder

json.decode => jsonDecode


我們定義個getData() 方法,后面帶個 async,就是解決異步的,當(dāng)然后面要更是await,大家應(yīng)該都懂。

反正就是很標(biāo)準(zhǔn)的一個http請求,在response.statusCode == HttpStatus.OK時(或者是 == 200), 就得到了我們想要的數(shù)據(jù),然后JSON.decode一下,然后setState方法,給我們widget中定義的參數(shù)賦值,然后就可以用了。如圖下,紅色圈出來的就是使用的方法。 在此我定義的參數(shù)為 data.

數(shù)據(jù)綁定

這樣,JSON數(shù)據(jù)就成功的渲染了。

數(shù)據(jù)的渲染

一個列表項(xiàng)肯定可以點(diǎn)擊進(jìn)入去查看他的詳情頁,所以,接下來我們就來實(shí)現(xiàn)這個小功能。

路由

這里要用到的就是路由功能了。

官方實(shí)例如下:官方導(dǎo)航+路由鏈接

Router官方實(shí)例

在我們的app中,寫法也是差不多的,但是我們需要將我們router的地址首先定義到我們的main.dart中

main.dart設(shè)定路由

這樣,我們就能在其他界面中,通過"/detail"的路徑,路由到這個界面。

但是正常的應(yīng)用中,我們的路由或多或少會帶上一些參數(shù),使得進(jìn)入下一個界面時,可以利用參數(shù)實(shí)現(xiàn)一些邏輯或者請求等等,下面我們就來看看怎么在路由中傳遞參數(shù):

路由傳遞參數(shù)

左圖是list界面,右邊是detail界面,要做的事:

1. 在列表中l(wèi)istTile中加入onTap事件,然后定義一個_onTap function,其中要接受String類型參數(shù)id,

2. 在navigator中push一個pageRouteBuilder, 直接將我們寫好的Detail類返回出來,帶上參數(shù)id.(當(dāng)然我們要提前在本界面中,把Detail的import進(jìn)來,不然返回個吊啊。。)。后面的transition就是過度動畫(現(xiàn)在不用管,反正這段代碼都是官方的)。

3. 在Detail.dart中一定要定義你需要傳入的參數(shù)名稱,不然就gg了。最后就可以為所欲為了, 哈哈。

在這里,點(diǎn)擊每一個對應(yīng)的列表項(xiàng),將跳轉(zhuǎn)到對應(yīng)的detail界面,并把列表項(xiàng)中的id屬性,一起傳過去,并顯示出來,通過左上回退按鈕,就可以回到列表頁,如下圖顯示:

路由傳參

組件通信

在vue, react各種流行的年代,那組件化的思想,flutter也不能丟了。那接下來我們就來實(shí)現(xiàn)一下組件之間的通信。那我們就在<通知>這個tab中來實(shí)現(xiàn)一個簡單的組件化通信。直接上代碼:

組建通信

左邊父組件:

1. 我們這里做了一個input框,然后定義一個參數(shù): active

2. 通過改變input的onChanged事件監(jiān)聽input值的變化,并賦值給Input組件的active

右邊子組件:

1. 通過下面代碼,接收傳過來的active的值


Input({Key key, this.active})


????: super(key: key);


2. 顯示active的值的變化

組件通信

這樣就實(shí)現(xiàn)了簡單的父組件對子組件的通信。

相關(guān)

下一篇:flutter基礎(chǔ)-組件通信(父子、兄弟)

結(jié)語

到這里本篇就結(jié)束了,有了以上的這些技術(shù)點(diǎn),完全夠咱們擼一個簡單但完整的app出來了吧,大家有機(jī)會就自己來試試,分分鐘擼一個app。

文章寫得實(shí)在匆忙,也是純新萌,所以邏輯如果有沒理順的,東西寫錯了的,大家就直接留言噴就好!

最后打包的流程,可以參考魚丸大神的這片文章:傳送門

http://www.itdecent.cn/p/f91b4e84cec8

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容