Flutter 瀑布流效果

前言 :

各位同學(xué)大家好, 瀑布流列表顯示效果相信在坐的同學(xué)中做過原生安卓 和iOS的同學(xué)都有實現(xiàn)過吧斯够。 原生的實現(xiàn)方式網(wǎng)上都很多開源例子甚至是開源庫 ,我就不展開講了。今天我主要給大家介紹下flutter中瀑布流如何實現(xiàn)的 法绵,廢話不多說我們正式開始 秧骑。

效果如圖:

QQ截圖20200626040819.png

準(zhǔn)備工作 :

安裝flutter環(huán)境 如果只是跑安卓設(shè)備渣淤, win系統(tǒng)就行了均抽。要是同時運行安卓和iOS 就需要mac電腦了 配置環(huán)境變量這邊就不展開講了,大家可以看我之前的文章。

需要用到的三方庫:

flutter_staggered_grid_view:
cached_network_image: ^2.2.0+1

flutter sdk 版本 如圖:

QQ截圖20200626042048.png

首先請把 這個兩個三方庫

 flutter_staggered_grid_view:
 cached_network_image: ^2.2.0+1

拷貝到項目的 pubspec.yaml 中 如圖:


QQ截圖20200626042144.png

然后在控制臺輸入 flutter pub get 命令進行下載以來即可


QQ截圖20200626042416.png

這邊主要是用到三方庫中的 StaggeredGridView 組件,在flutter原生api的里面提供的lisview 和gridview 并沒有提供瀑布流的實現(xiàn)效果 取具,所以我們用到這個三方庫組件 StaggeredGridView 來實現(xiàn)脖隶。

1、使用StaggeredGridView

大體就兩種方式暇检,一種是傳入List<Widget>另一種是用itemBuilder創(chuàng)建item产阱,默認(rèn)提供了一下幾種方法創(chuàng)建,根據(jù)自己的需要選擇即可块仆。

StaggeredGridView()
StaggeredGridView.builder()
StaggeredGridView.custom()
StaggeredGridView.count()
StaggeredGridView.countBuilder()
StaggeredGridView.extent()
StaggeredGridView.extentBuilder()

這里我們選擇使用countBuilder這種模式

  body: new StaggeredGridView.countBuilder(
        padding: const EdgeInsets.all(8.0),
        crossAxisCount: 4,
        itemCount: imgList.length,
        itemBuilder: (context, i) {
          return itemWidget(i);
        },
      //  staggeredTileBuilder: (index) => new StaggeredTile.fit(2),
        staggeredTileBuilder: (int index) =>
        new StaggeredTile.count(2, index == 0 ? 2.5 : 3),    //
        mainAxisSpacing: 8.0,
        crossAxisSpacing: 8.0,
      ),

staggeredTileBuilder則決定每個item的寬高,核心邏輯心墅。

  staggeredTileBuilder: (int index) => new StaggeredTile.count(2, index == 0 ? 2.5 : 3),    

我這里設(shè)置第一張主軸為2.5其他的為3這樣就形成了一個簡單的瀑布流樣式

具體效果如圖:

QQ截圖20200626040819.png

具體完整代碼實現(xiàn)如下:

import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'full_screenimagepage.dart';
/**
 * 創(chuàng)建人:xuqing
 * 創(chuàng)建時間:2020年6月26日04:00:19
 * 類說明:瀑布流主頁邏輯實現(xiàn)
 *
 */
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: '瀑布流'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
 List imgList = [
    "http://yanxuan.nosdn.127.net/65091eebc48899298171c2eb6696fe27.jpg",
    "http://yanxuan.nosdn.127.net/8b30eeb17c831eba08b97bdcb4c46a8e.png",
    "http://yanxuan.nosdn.127.net/a196b367f23ccfd8205b6da647c62b84.png",
    "http://yanxuan.nosdn.127.net/149dfa87a7324e184c5526ead81de9ad.png",
    "http://yanxuan.nosdn.127.net/88dc5d80c6f84102f003ecd69c86e1cf.png",
    "http://yanxuan.nosdn.127.net/8b9328496990357033d4259fda250679.png",
    "http://yanxuan.nosdn.127.net/c39d54c06a71b4b61b6092a0d31f2335.png",
    "http://yanxuan.nosdn.127.net/ee92704f3b8323905b51fc647823e6e5.png",
    "http://yanxuan.nosdn.127.net/e564410546a11ddceb5a82bfce8da43d.png",
    "http://yanxuan.nosdn.127.net/56f4b4753392d27c0c2ccceeb579ed6f.png",
    "http://yanxuan.nosdn.127.net/6a54ccc389afb2459b163245bbb2c978.png",
    'https://picsum.photos/id/101/548/338',
    'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1569842561051&di=45c181341a1420ca1a9543ca67b89086&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fblog%2F201504%2F17%2F20150417212547_VMvrj.jpeg',
    'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570437233&di=9239dbc3237f1d21955b50e34d76c9d5&imgtype=jpg&er=1&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fblog%2F201508%2F30%2F20150830095308_UAQEi.thumb.700_0.jpeg'
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: new StaggeredGridView.countBuilder(
        padding: const EdgeInsets.all(8.0),
        crossAxisCount: 4,
        itemCount: imgList.length,
        itemBuilder: (context, i) {
          return itemWidget(i);
        },
      //  staggeredTileBuilder: (index) => new StaggeredTile.fit(2),
        staggeredTileBuilder: (int index) =>
        new StaggeredTile.count(2, index == 0 ? 2.5 : 3),    //
        mainAxisSpacing: 8.0,
        crossAxisSpacing: 8.0,
      ),
    );
  }
   Widget  itemWidget(int index){
     String imgPath = imgList[index];
     return new Material(
       elevation: 8.0,
       borderRadius: new BorderRadius.all(
         new Radius.circular(8.0),
       ),
       child: new InkWell(
         onTap: () {
           Navigator.push(
             context,
             new MaterialPageRoute(
               builder: (context) {
                 return new FullScreenImagePage(imageurl: imgPath);
               },
             ),
           );
         },
         child: new Hero(
           tag: imgPath,
           child: CachedNetworkImage(
             imageUrl: imgPath,
             fit: BoxFit.fitWidth,
             /*    placeholder: (context, url) =>
                      Image.asset('assets/wallfy.png'),*/
           ),
         ),
       ),
     );
   }
}

最后在item的點擊事件里面添加了點擊跳轉(zhuǎn)到新開頁面widget顯示所點擊的圖片
點擊核心代碼

onTap: () {
           Navigator.push(
             context,
             new MaterialPageRoute(
               builder: (context) {
                 return new FullScreenImagePage(imageurl: imgPath);
               },
             ),
           );
         },

通過構(gòu)造方法把選中的圖片的url傳到 FullScreenImagePage 類中, 然后在Img.network中傳入即可實現(xiàn)
跳轉(zhuǎn)新頁面核心代碼 :

import 'package:flutter/material.dart';
/**
 *
 * 創(chuàng)建人:xuqing
 * 創(chuàng)建時間:2020年6月26日03:03:05
 * 類說明:圖片詳情頁面
 *
 */
class FullScreenImagePage extends StatefulWidget {
  final String  imageurl;
  FullScreenImagePage({Key key,this.imageurl}) : super(key: key);

  @override
  _FullScreenImagePageState createState() {
    return _FullScreenImagePageState();
  }
}
class _FullScreenImagePageState extends State<FullScreenImagePage> {
  @override
  void initState() {
    super.initState();
  }
  @override
  void dispose() {
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text("圖片詳情頁面"),
        centerTitle: true,
      ),
      body:Container(
        margin: EdgeInsets.all(20.0),
        child: Image.network(widget.imageurl, fit: BoxFit.fitWidth,),
      ),
    );
  }
}

最后總結(jié) :

相交于安卓原生來說 flutter提供了很好用很方便的三方庫組件flutter_staggered_grid_view, 來實現(xiàn)就簡單方便很多 也節(jié)省大家的開發(fā)時間和提供開發(fā)效率酿矢。flutter_staggered_grid_view 用法用起來和gridview差別不大,個別特殊屬性大家需要注意 ,當(dāng)然這種瀑布流列表布局也可以自己封裝gridview來實現(xiàn) 有興趣的同學(xué)可以私下研究下怎燥。這里就不過多講了 最后希望我的文章能幫助到各位解決問題 ,以后我還會貢獻更多有用的代碼分享給大家蜜暑。如果覺得文章還不錯 ,麻煩給關(guān)注和star
項目地址:https://github.com/xq19930522/pubuliu

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載铐姚,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末肛捍,一起剝皮案震驚了整個濱河市隐绵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拙毫,老刑警劉巖依许,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缀蹄,居然都是意外死亡峭跳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門缺前,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛀醉,“玉大人,你說我怎么就攤上這事衅码≌螅” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵逝段,是天一觀的道長士骤。 經(jīng)常有香客問我,道長碧囊,這世上最難降的妖魔是什么特漩? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮巫糙,結(jié)果婚禮上朗儒,老公的妹妹穿的比我還像新娘。我一直安慰自己参淹,他們只是感情好醉锄,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浙值,像睡著了一般恳不。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上开呐,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天烟勋,我揣著相機與錄音规求,去河邊找鬼。 笑死卵惦,一個胖子當(dāng)著我的面吹牛阻肿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沮尿,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼丛塌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了畜疾?” 一聲冷哼從身側(cè)響起赴邻,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啡捶,沒想到半個月后姥敛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瞎暑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年彤敛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片金顿。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡臊泌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出揍拆,到底是詐尸還是另有隱情渠概,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布嫂拴,位于F島的核電站播揪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏筒狠。R本人自食惡果不足惜猪狈,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辩恼。 院中可真熱鬧雇庙,春花似錦、人聲如沸灶伊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聘萨。三九已至竹椒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間米辐,已是汗流浹背胸完。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工书释, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赊窥。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓爆惧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锨能。 傳聞我的和親對象是個殘疾皇子检激,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348