Flutter列表恕沫、抽屜监憎、Tab、底部按鈕 快速實(shí)例

觀念

  1. 物件都是Widget
  2. 樹(shù)狀結(jié)構(gòu)
  3. 常用元件已定好實(shí)現(xiàn)參數(shù)

==========================資料(post.dart)==========================

class Post{
  const Post({//類(lèi)似C++的Constructor
    this.title,
    this.author,
    this.imageUrl,
  });

  final String title;
  final String author;
  final String imageUrl;
}

//初始化列表給值
final List<Post> posts = [
  Post(
    title: 'Title1',
    author: 'Author1',
    imageUrl: 'https://pics1.baidu.com/feed/c8ea15ce36d3d539258179c355f7fc56342ab0ec.jpeg?token=b1269188a783ffac3a8fa9b5d2b423f8&s=0330E02254AB0AAC261F1CC90000C0B0'
  ),
  Post(
      title: 'Title2',
      author: 'Author2',
      imageUrl: 'https://pics2.baidu.com/feed/6609c93d70cf3bc79b66c0cbbe70afa7cd112a2c.jpeg?token=2770e8c64a553b63aac48448202bfc1a&s=E1F51BC68B042F70104CD8A903005006'
  ),
  Post(
      title: 'Title3',
      author: 'Author3',
      imageUrl: 'https://pics1.baidu.com/feed/1f178a82b9014a909ccf587ff0c72f14b11beeb1.jpeg?token=e7fd680ccbf6aa973c03573b0b8c3012&s=ED85BC540C009C591CA838950300D08C'
  ),
];

======================列表(listview_demo.dart)======================

import 'package:flutter/material.dart';
import '../model/post.dart';
class MyListView extends StatelessWidget{//StatelessWidge不可改變, StatefullWidget為可改變, 此處僅顯示列表並無(wú)改變採(cǎi)用StatelessWidget
  Widget _listItemBuilder(BuildContext context, int index){
    return Container(
      color: Colors.white,
      margin: EdgeInsets.all(8.0),//項(xiàng)目margin
      child: Column(//垂直項(xiàng)目Column如android的linearlayout
          children: <Widget>[
            Image.network(posts[index].imageUrl),//直接使用url便能載入, 可設(shè)填滿(mǎn)的類(lèi)型Image.network(posts[index].imageUrl, fit: BoxFit.fill,width: double.infinity,)
            SizedBox(height: 16.0,),//設(shè)空白高度(間距)
             Row(//水平項(xiàng)目
                mainAxisAlignment: MainAxisAlignment.start,//內(nèi)容置左
                children: <Widget>[
                  Icon(Icons.check_circle, size: 30.0, color: Colors.grey[300]),
                  Image.network(posts[index].imageUrl, width: 50,),
                  new Expanded(child: Text(//填滿(mǎn)該文字
                    posts[index].title,
                    style: Theme.of(context).textTheme.title,
                    textAlign: TextAlign.right,
                  ),)

                ]
            ),
            Text(
                posts[index].title,
                style: Theme.of(context).textTheme.title
            ),
            Text(
                posts[index].author,
                style: Theme.of(context).textTheme.subhead
            ),
            SizedBox(height: 16.0,)
          ]
      ),
    );
  }
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return ListView.builder(
      itemCount: posts.length,
      itemBuilder: _listItemBuilder,
    );
  }
}

======================抽屜(drawer_demo.dart)======================

class Home extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Scaffold(
        drawer: MyDrawer(),
      ),
    );
  }
}
import 'package:flutter/material.dart';

class MyDrawer extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Drawer(
      child: ListView(
        padding: EdgeInsets.zero,//該項(xiàng)目無(wú)間距
        children: <Widget>[
          UserAccountsDrawerHeader(//大頭照及名稱(chēng)信箱
            accountName: Text('Adam', style: TextStyle(fontWeight: FontWeight.bold),),
            accountEmail: Text('xxx@gmail.com', ),
            currentAccountPicture: CircleAvatar(//圓形圖
              backgroundImage: NetworkImage('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1580055708032&di=1ce2fa1deb54ead52a9020c4beb7cd97&imgtype=0&src=http%3A%2F%2Fb.hiphotos.baidu.com%2Fzhidao%2Fpic%2Fitem%2Fa8014c086e061d9513b305a87bf40ad163d9caac.jpg'),
            ),
            decoration: BoxDecoration(//大頭照底面
                color: Colors.yellow[400],
                image: DecorationImage(//裝飾圖片
                    image: NetworkImage('https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2232748475,1633793751&fm=26&gp=0.jpg'),
                    fit: BoxFit.cover,
                    colorFilter: ColorFilter.mode(//濾鏡withOpacity給透明度
                        Colors.yellow[400].withOpacity(0.6),
                        BlendMode.hardLight
                    )
                )
            ),
          ),
          ListTile(//圖片文字項(xiàng)目, MyListView中Row的簡(jiǎn)單應(yīng)用可採(cǎi)用這個(gè)
            title: Text('Message', textAlign: TextAlign.right,),
            trailing: Icon(Icons.message, color: Colors.black12, size: 22.0,),//圖片在頭用leading, 在尾用trailing
            onTap: () => Navigator.pop(context),
          ),
          ListTile(
            title: Text('Favorite', textAlign: TextAlign.right,),
            trailing: Icon(Icons.favorite, color: Colors.black12, size: 22.0,),
            onTap: () => Navigator.pop(context),
          ),
          ListTile(
            title: Text('Setting', textAlign: TextAlign.right,),
            trailing: Icon(Icons.settings, color: Colors.black12, size: 22.0,),
            onTap: () => Navigator.pop(context),
          )
        ],
      ),
    );
  }
}

======================Tab(main.dart)======================

import 'package:flutter/material.dart';
import 'demo/basic_demo.dart';
import 'demo/bottom_navigationbar_demo.dart';
import 'demo/drawer_demo.dart';
import 'demo/listview_demo.dart';
import 'demo/hello_demo.dart';
void main() => runApp(App());
class App extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home:Home(),
      theme: ThemeData(
        primarySwatch: Colors.yellow,
        highlightColor: Color.fromRGBO(255,255, 255, 0.5),
        splashColor: Colors.white70
      ),
    );
  }
}
class Home extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 3,//tab有三頁(yè)
      child: Scaffold(
        backgroundColor: Colors.grey[100],
        appBar: AppBar(//設(shè)定標(biāo)題列
          leading: IconButton(//左側(cè)按鈕, 不給會(huì)預(yù)設(shè)菜單紐, 點(diǎn)擊會(huì)彈開(kāi)drawer
              icon: Icon(Icons.star),
              tooltip: 'Navigration',
              onPressed: () => debugPrint('Navigration button is pressed!')
          ),
          title: Text('Adam'),
          centerTitle: true,
          actions: <Widget>[//右側(cè)其餘按鈕, 可多個(gè)
            IconButton(
                icon: Icon(Icons.search),
                tooltip: 'Search',
                onPressed: () => debugPrint('Search button is pressed!')
            ),
          ],
          elevation: 0.0,//tab下方陰影, 0為沒(méi)陰影
          bottom: TabBar(
            unselectedLabelColor: Colors.black38,
              indicatorColor: Colors.black54,
              indicatorSize: TabBarIndicatorSize.label,//下方線寬度, label為包住按鈕內(nèi)容, tab為整個(gè)tab寬度
              indicatorWeight: 1.0,
              tabs: <Widget>[
                Tab(icon: Icon(Icons.local_florist), text: 'test123',),//按鈕下方文字
                Tab(icon: Icon(Icons.change_history)),
                Tab(icon: Icon(Icons.directions_bike)),
              ]),
        ),
        body: TabBarView(//設(shè)定tab頁(yè)面內(nèi)容, 可隨意給Icon, Text或自製的頁(yè)面
            children: <Widget>[
              MyListView(),
              Icon(Icons.change_history, size: 128.0, color: Colors.black12),
              Icon(Icons.directions_bike, size: 128.0, color: Colors.black12),
            ]
        ),
        //drawer: Container
        drawer: MyDrawer(),//設(shè)置抽屜
        bottomNavigationBar: MyBottomNavigationBar(),//設(shè)置底部按鈕
      ),
    );
  }
}

================底部按鈕(bottom_navigationbar_demo.dart)================

import 'package:flutter/material.dart';

class MyBottomNavigationBar extends StatefulWidget{//點(diǎn)下方按鈕要切換index, 用StatefulWidget
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _BottomNavigationBarDemoState();
  }
}
class _BottomNavigationBarDemoState extends State<MyBottomNavigationBar>{
  int _currentIndex = 0;

  void _onTabHandler(int index){//點(diǎn)擊動(dòng)作, 設(shè)置index
    setState((){
      _currentIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return BottomNavigationBar(
        currentIndex: _currentIndex,
        onTap: _onTabHandler,
        type: BottomNavigationBarType.fixed,//按鈕為固定型態(tài)
        fixedColor: Colors.black,
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.explore),
            title: Text('Explore'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.history),
            title: Text('History'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.list),
            title: Text('List'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.person),
            title: Text('My'),
          ),
        ]
    );
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婶溯,一起剝皮案震驚了整個(gè)濱河市鲸阔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迄委,老刑警劉巖褐筛,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叙身,居然都是意外死亡渔扎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)信轿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晃痴,“玉大人残吩,你說(shuō)我怎么就攤上這事√群耍” “怎么了泣侮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)紧唱。 經(jīng)常有香客問(wèn)我旁瘫,道長(zhǎng),這世上最難降的妖魔是什么琼蚯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任酬凳,我火速辦了婚禮,結(jié)果婚禮上遭庶,老公的妹妹穿的比我還像新娘宁仔。我一直安慰自己,他們只是感情好峦睡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布翎苫。 她就那樣靜靜地躺著,像睡著了一般榨了。 火紅的嫁衣襯著肌膚如雪煎谍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,166評(píng)論 1 308
  • 那天龙屉,我揣著相機(jī)與錄音呐粘,去河邊找鬼。 笑死转捕,一個(gè)胖子當(dāng)著我的面吹牛作岖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播五芝,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼痘儡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了枢步?” 一聲冷哼從身側(cè)響起沉删,我...
    開(kāi)封第一講書(shū)人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎醉途,沒(méi)想到半個(gè)月后矾瑰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡结蟋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年脯倚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡推正,死狀恐怖恍涂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情植榕,我是刑警寧澤再沧,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站尊残,受9級(jí)特大地震影響炒瘸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寝衫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一顷扩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慰毅,春花似錦隘截、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至着饥,卻和暖如春犀农,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宰掉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工呵哨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贵扰。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓仇穗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親戚绕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359