周五看一人之下前學習下Flutter的PageView?

大家好, 今天我們來用Flutter來實現(xiàn)一個Android中的卡片式的ViewPager.

  • 代碼總數(shù)100行. 核心代碼60行.
  • 閱讀時間8分鐘.

使用到的Flutter技術為:

  • PageView, StatefulWidget, Gradient和Snackbar.

先上效果圖.
直接run代碼如下圖.


PageView正常效果圖

點擊infinite button切換gradient效果:


PageView Gradient效果圖

點擊每一個卡片, 跳出SnackBar顯示description如下:
全屏SnackBar

感覺很簡單對吧. 那我們先回顧一下, 在Android里面我們要實現(xiàn)這樣的效果的做法通常是什么樣的呢?

  • 做一個viewpager.
  • 一組Fragment.
  • 每個Fragment綁定一個xml.
  • 最后填充viewpager.

如果我們用Flutter實現(xiàn)起來就非常簡單. 我們來過一下:

  1. 第一步, 準備我們的images和會在點擊時使用在SnackBar的descriptions. 這里我用了我每周五都追的動漫一人之下的幾張百度來的圖. 什么? 你不知道一人之下? 快去補番!!!
final Listimages = [
'images/wallpapers/wallpaper1.jpg', 
'images/wallpapers/wallpaper2.jpg', 
'images/wallpapers/wallpaper3.jpg',
];

final List descriptions = [
  '不搖碧蓮准潭,干翻蒼穹',
  '周五快到了挽鞠,準備追更新',
  '社會我寶姐对途,人美路子野',
];
  1. 做個App, 這里我用了MaterialApp和ThemeData設置為deepOrange.
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Gallery Demo',
      theme: ThemeData(primarySwatch: Colors.deepOrange),
      home: DisplayPage(),
    );
  }
}
  1. 做個StatefulWidget, 因為我們想要維護一個_isAddGradient. 通過這個變量我們想通知widget tree變?yōu)間radient和非gradient的兩種狀態(tài).
class DisplayPage extends StatefulWidget {
  @override
  _DisplayPageState createState() => new _DisplayPageState();
}

class _DisplayPageState extends State<DisplayPage> {
  bool _isAddGradient = false;
///
}
  1. 我們先做一個FloatingActionButton. 這個是Scaffold提供給我們的. 我們用這個button來改變_isAddGradient.
   FloatingActionButton _floatingActionButton = FloatingActionButton(
      onPressed: () {
        _isAddGradient = !_isAddGradient;
        setState(() {
          _isAddGradient;
        });
      },
      tooltip: 'Switch Gradient Effect',
      child: Icon(Icons.all_inclusive),
    );
  1. 做個DecoratedBox, 可以實現(xiàn)我們要的gradient效果. 這里我們用一個LinearGradient. 從bottomRight到topLeft結束.
    var decorationBox = DecoratedBox(
      decoration: _isAddGradient
          ? BoxDecoration(
              gradient: LinearGradient(
                begin: FractionalOffset.bottomRight,
                end: FractionalOffset.topLeft,
                colors: [
                  Color(0x00000000).withOpacity(0.9),
                  Color(0xff000000).withOpacity(0.01),
                ],
              ),
            )
          : BoxDecoration(),
    );
  1. 在_DisplayState的build function返回Scaffold和所有主體邏輯. 這里我們用PageView.builder來建立PageView. 我們給每一個item加上Padding. 加上GestureDetector來實現(xiàn)點擊顯示SnackBar. 我們在SnackBar的Text上加上Center讓它充滿全屏.
 return Scaffold(
      floatingActionButton: _floatingActionButton,
      body: Center(
        child: SizedBox.fromSize(
          size: Size.fromHeight(550.0),
          child: PageView.builder(
            controller: PageController(viewportFraction: 0.8),
            itemCount: images.length,
            itemBuilder: (BuildContext context, int index) {
              return Padding(
                padding: EdgeInsets.symmetric(
                  vertical: 16.0,
                  horizontal: 8.0,
                ),
                child: GestureDetector(
                  onTap: () {
                    Scaffold.of(context).showSnackBar(SnackBar(
                          backgroundColor: Colors.deepOrangeAccent,
                          duration: Duration(milliseconds: 800),
                          content: Center(
                            child: Text(
                              descriptions[index],
                              style: TextStyle(fontSize: 25.0),
                            ),
                          ),
                        ));
                  },
                  child: Material(
                    elevation: 5.0,
                    borderRadius: BorderRadius.circular(8.0),
                    child: Stack(
                      fit: StackFit.expand,
                      children: [
                        Image.asset(
                          images[index],
                          fit: BoxFit.cover,
                        ),
                        decorationBox,
                      ],
                    ),
                  ),
                ),
              );
            },
          ),
        ),
      ),
    );
  1. 別忘了在main函數(shù)里run下我們的app.
void main() => runApp(MyApp());

好了, 打完收工. 是不是Flutter很簡單幾行代碼我們就實現(xiàn)了Android里的ViewPager了呢?

Source Code下載: 點我去GitHub下載你最愛的源碼

歐了, 謝謝觀賞浪蹂,大家加油铃彰!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晌区,一起剝皮案震驚了整個濱河市忌傻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疆虚,老刑警劉巖苛败,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異径簿,居然都是意外死亡罢屈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門篇亭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缠捌,“玉大人,你說我怎么就攤上這事译蒂÷拢” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵柔昼,是天一觀的道長哑芹。 經(jīng)常有香客問我,道長捕透,這世上最難降的妖魔是什么聪姿? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任碴萧,我火速辦了婚禮,結果婚禮上咳燕,老公的妹妹穿的比我還像新娘勿决。我一直安慰自己,他們只是感情好招盲,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嘉冒,像睡著了一般曹货。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讳推,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天顶籽,我揣著相機與錄音,去河邊找鬼银觅。 笑死礼饱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的究驴。 我是一名探鬼主播镊绪,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼洒忧!你這毒婦竟也來了蝴韭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤熙侍,失蹤者是張志新(化名)和其女友劉穎榄鉴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛉抓,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡庆尘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巷送。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驶忌。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惩系,靈堂內(nèi)的尸體忽然破棺而出位岔,到底是詐尸還是另有隱情,我是刑警寧澤堡牡,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布抒抬,位于F島的核電站,受9級特大地震影響晤柄,放射性物質(zhì)發(fā)生泄漏擦剑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惠勒。 院中可真熱鬧赚抡,春花似錦、人聲如沸纠屋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽售担。三九已至赁遗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間族铆,已是汗流浹背岩四。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哥攘,地道東北人剖煌。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像逝淹,于是被迫代替她去往敵國和親耕姊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容