微信項目 - 發(fā)現(xiàn)頁面與我的頁面

上面文章我們初步進行了項目搭建招狸,下面就來開發(fā)微信項目的發(fā)現(xiàn)頁面

自定義cell

通過微信發(fā)現(xiàn)頁面的UI圖,我們知道Cell需要對外提供四個屬性title嗤栓、subTitle烈菌、imageName矮嫉、subImageName用于頁面展示

  • 新建自定義Cell文件滑臊,名稱為discover_cell.dart
import 'package:flutter/material.dart';

class DiscoverCell extends StatelessWidget {
  final String title;
  final String subTitle;
  final String imageName;
  final String subImageName;

  DiscoverCell({
    // @required表示必須要有title imageName值
    @required this.title,
    this.subTitle,
    @required this.imageName,
    this.subImageName
    // 添加assert斷言痰娱,進行提示
  }) : assert(title != null, 'title 不能為空'), assert(imageName != null, 'imageName 不能為空');

  @override
  Widget build(BuildContext context) {
    return Container(
        // Cell添加背景色
        color: Colors.white,
        height: 55,
        child: Row(
          // 主軸是spaceBetween
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            //left
            Container(
              padding: EdgeInsets.all(10),
              child: Row(
                children: [
                  Image(
                    image: AssetImage(imageName),
                    width: 20,
                  ),
                  SizedBox(
                    width: 15,
                  ),
                  Text(title),
                ],
              ),
            ),

            //right
            Container(
              padding: EdgeInsets.all(10),
              child: Row(
                children: [
                  subTitle != null ? Text(subTitle) : Text(''),
                  subImageName != null
                      ? Image(
                          image: AssetImage(subImageName),
                          width: 12,
                        )
                      : Container(),
                  Image( //右側(cè)箭頭
                    image: AssetImage('images/icon_right.png'),
                    width: 15,
                  )
                ],
              ),
            ),
          ],
        ),
      );
  }
}

發(fā)現(xiàn)頁面完善

discover_page.dart文件添加ListView

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

class DiscoverPage extends StatefulWidget {
  @override
  _DiscoverPageState createState() => _DiscoverPageState();
}

class _DiscoverPageState extends State<DiscoverPage> {
  Color _themeColor = Color.fromRGBO(220, 220, 220, 1.0);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          backgroundColor: _themeColor,
          //以下三個是專門為了安卓使用的屬性弃榨,title用于安卓退出后臺頂部顯示app名稱
          centerTitle: true,
          title: Text('發(fā)現(xiàn)'),
          elevation: 0.0, //設置NaviBar底部邊欄為隱藏
        ),
        body: Container(
          color: _themeColor,
          height: 800,
          child: ListView(
            children: <Widget>[
              DiscoverCell(
                imageName: 'images/朋友圈.png',
                title: '朋友圈',
              ),
              SizedBox(
                height: 10,
              ),
              DiscoverCell(
                imageName: 'images/掃一掃2.png',
                title: '掃一掃',
              ),
              // cell分隔線
              Row(
                children: <Widget>[
                  Container(width: 50, height: 0.5, color: Colors.white),
                  Container(height: 0.5, color: Colors.grey)
                ],
              ),
              DiscoverCell(
                imageName: 'images/搖一搖.png',
                title: '搖一搖',
              ),
              SizedBox(
                height: 10,
              ),
              DiscoverCell(
                imageName: 'images/看一看icon.png',
                title: '看一看',
              ),
              Row(
                children: <Widget>[
                  Container(width: 50, height: 0.5, color: Colors.white),
                  Container(height: 0.5, color: Colors.grey)
                ],
              ),
              DiscoverCell(
                imageName: 'images/搜一搜 2.png',
                title: '搜一搜',
              ),
              SizedBox(
                height: 10,
              ),
              DiscoverCell(
                imageName: 'images/附近的人icon.png',
                title: '附近的人',
              ),
              SizedBox(
                height: 10,
              ),
              DiscoverCell(
                imageName: 'images/購物.png',
                title: '購物',
                subTitle: '618限時特價',
                subImageName: 'images/badge.png',
              ),
              Row(
                children: <Widget>[
                  Container(width: 50, height: 0.5, color: Colors.white),
                  Container(height: 0.5, color: Colors.grey)
                ],
              ),
              DiscoverCell(
                imageName: 'images/游戲.png',
                title: '游戲',
              ),
              SizedBox(
                height: 10,
              ),
              DiscoverCell(
                imageName: 'images/小程序.png',
                title: '小程序',
              ),
            ],
          ),
        ));
  }
}
運行效果

cell點擊切換頁面

上面我們實現(xiàn)了發(fā)現(xiàn)頁面的列表,但是Cell還無法點擊梨睁,下面實現(xiàn)Cell點擊以及跳轉(zhuǎn)邏輯

  • cell添加手勢GestureDetector鲸睛,添加完手勢點擊cell就會有回調(diào)事件onTap
// discover_cell.dart文件中添加手勢
@override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        print('haha _$title');
      },
      child: Container(
        // Cell添加背景色
        color: Colors.white,
        height: 54,
......
  • 新建二級頁面discover_child_page.dart,用于cell跳轉(zhuǎn)
import 'package:flutter/material.dart';

class DiscoverChildPage extends StatelessWidget {
  final String title;
  DiscoverChildPage({this.title});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('$title'),
      ),
      body: Center(
        child: Text('$title'),
      ),
    );
  }
}
  • GestureDetector回調(diào)方法onTap中添加跳轉(zhuǎn)邏輯
// 導入頭文件
import 'discover_child_page.dart';

@override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        // 添加跳轉(zhuǎn)二級頁面方法
        Navigator.of(context).push(
          // BuildContext上下文
          MaterialPageRoute(builder: (BuildContext context) =>
            DiscoverChildPage(title: '$title')
          )
        );
      },
      child: Container(
        // Cell添加背景色
        color: Colors.white,
        height: 54,
......
點擊跳轉(zhuǎn)二級頁面

注意??:如果不小心點到Pub get導致flutter卡住坡贺,一般是網(wǎng)絡的原因官辈,也有可能是不小心改動了pubspec.yaml文件,復制一份重新配置遍坟。

有狀態(tài)的cell

Widget與界面的關系
  • Widget是界面的描述拳亿,并不是界面。
  • 如果cell內(nèi)容非常復雜愿伴,出于性能考慮肺魁,需要把cell部分改成有狀態(tài)的
  • 如果cell整體是有狀態(tài)的隔节,界面的描述會被整體改變鹅经。
  • 如果cell整體是有狀態(tài)的胡桨,渲染的時候并不是整體渲染,而是整個cellWidget會重新創(chuàng)建瞬雹。為了提高性能昧谊,可以把cell的部分Widget抽取出來做成可變的,而整個cell是不可變的酗捌。
  • 如果整個cell是不可變的呢诬,在創(chuàng)建對象的時候,cell不會重新創(chuàng)建胖缤,而是cell內(nèi)部的Widget會重新創(chuàng)建尚镰,也就是Container會重新創(chuàng)建。

GestureDetector手勢的點擊狀態(tài)

@override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        print('haha _$title');
        Navigator.of(context).push(
            MaterialPageRoute(builder: (BuildContext context) =>
                DiscoverChildPage(title: '$title')
            )
        );
      },
      // 點擊
      onTapDown: (TapDownDetails details) {
        print('點下來了哪廓!');
      },
      // 取消點擊
      onTapCancel: () {
        print('離開了狗唉!');
      },
......

// 控制臺成功打印
flutter: 點下來了!
flutter: 離開了涡真!
flutter: 點下來了分俯!
flutter: haha _DiscoverCell.title
  • 修改DiscoverCell為有狀態(tài)的
import 'package:flutter/material.dart';

import 'discover_child_page.dart';

class DiscoverCell extends StatefulWidget {
  final String title;
  final String subTitle;
  final String imageName;
  final String subImageName;

  DiscoverCell({
    // @required表示必須要有title imageName值
    required this.title,
    this.subTitle,
    required this.imageName,
    this.subImageName
    // 添加assert斷言,進行提示
  }) : assert(title != null, 'title 不能為空'), assert(imageName != null, 'imageName 不能為空');

  // 有狀態(tài)的Widget需要實現(xiàn)createState方法
  @override
  State<StatefulWidget> createState() => _DiscoverCellState();
}

// 問題一 _DiscoverCellState訪問不到DiscoverCell中的 title等屬性哆料?
// 解決方法  使用 widget.title, _DiscoverCellState中使用widget,這里的widget就是DiscoverCell

class _DiscoverCellState extends State<DiscoverCell> {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        print('haha _$widget.title');
        Navigator.of(context).push(
            MaterialPageRoute(builder: (BuildContext context) =>
                DiscoverChildPage(title: widget.title)
            )
        );
      },
      onTapDown: (TapDownDetails details) {
        print('點下來了缸剪!');
      },
      onTapCancel: () {
        print('離開了!');
      },
      child: Container(
        // Cell添加背景色
        color: Colors.white,
        height: 54,
        child: Row(
          // 主軸是spaceBetween
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            //left
            Container(
              padding: EdgeInsets.all(10),
              child: Row(
                children: [
                  Image(
                    image: AssetImage(widget.imageName),
                    width: 20,
                  ),
                  SizedBox(
                    width: 15,
                  ),
                  Text(widget.title),
                ],
              ),
            ),

            //right
            Container(
              padding: EdgeInsets.all(10),
              child: Row(
                children: [
                  widget.subTitle != null ? Text(widget.subTitle) : Text(''),
                  widget.subImageName != null
                      ? Image(
                    image: AssetImage(widget.subImageName),
                    width: 12,
                  )
                      : Container(),
                  Image( //右側(cè)箭頭
                    image: AssetImage('images/icon_right.png'),
                    width: 15,
                  )
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

問題: _DiscoverCellState訪問不到DiscoverCell中的 title等屬性东亦?
解決方法:_DiscoverCellState中使用widget.title來訪問DiscoverCell中的title屬性杏节,這里的widget就是DiscoverCell

  • color抽取出來,通過手勢點擊修改cell背景色
class _DiscoverCellState extends State<DiscoverCell> {
  Color _currentColor = Colors.white;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        print('haha _$widget.title');
        Navigator.of(context).push(
            MaterialPageRoute(builder: (BuildContext context) =>
                DiscoverChildPage(title: widget.title)
            )
        );
        setState(() {
          _currentColor = Colors.white;
        });
      },
      onTapDown: (TapDownDetails details) {
        print('點下來了典阵!');
        setState(() {
          _currentColor = Colors.grey;
        });
      },
      onTapCancel: () {
        print('離開了奋渔!');
        setState(() {
          _currentColor = Colors.white;
        });
      },
      child: Container(
        // Cell添加背景色
        color: _currentColor,
        height: 54,
......
點擊Cell時灰色,取消點擊變成白色

我的頁面布局

新建discover文件夾右擊 -> new -> package壮啊,把發(fā)現(xiàn)相關頁面放入

  • mine_page.dart文件中編寫內(nèi)容
  • MediaQuery.removePadding內(nèi)屬性removeTop: true,可以去掉劉海屏頂部的默認偏移
import 'package:flutter/material.dart';
import 'discover/discover_cell.dart';

class MinePage extends StatefulWidget {
  @override
  _MinePageState createState() => _MinePageState();
}

class _MinePageState extends State<MinePage> {

  Widget headerWidget() {
    return Container(
      height: 200,
      color: Colors.red,
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        color: Color.fromRGBO(220, 220, 220, 1),
        child: Stack(
          children: [
            //列表嫉鲸,用Container包一層會更靈活一點,方便抽出來
            Container(
              //Flutter官方封裝的一些屬性K蕖充坑!
              child: MediaQuery.removePadding(
                  // 去掉劉海屏頂部的偏移部分
                  removeTop: true,
                  context: context,
                  child: ListView(
                    children: [
                      //頭部
                      headerWidget(),
                      //list
                      SizedBox(
                        height: 10,
                      ),
                      DiscoverCell(
                        imageName: 'images/微信 支付.png',
                        title: '支付',
                      ),
                      SizedBox(
                        height: 10,
                      ),
                      DiscoverCell(
                        imageName: 'images/微信收藏.png',
                        title: '收藏',
                      ),
                      Row(
                        children: <Widget>[
                          Container(
                              width: 50, height: 0.5, color: Colors.white),
                          Container(height: 0.5, color: Colors.grey)
                        ],
                      ), //分割線
                      DiscoverCell(
                        imageName: 'images/微信相冊.png',
                        title: '相冊',
                      ),
                      Row(
                        children: <Widget>[
                          Container(
                              width: 50, height: 0.5, color: Colors.white),
                          Container(height: 0.5, color: Colors.grey)
                        ],
                      ), //分割線
                      DiscoverCell(
                        imageName: 'images/微信卡包.png',
                        title: '卡包',
                      ),
                      Row(
                        children: <Widget>[
                          Container(
                              width: 50, height: 0.5, color: Colors.white),
                          Container(height: 0.5, color: Colors.grey)
                        ],
                      ), //分割線
                      DiscoverCell(
                        imageName: 'images/微信表情.png',
                        title: '表情',
                      ),
                      SizedBox(
                        height: 10,
                      ),
                      DiscoverCell(
                        imageName: 'images/微信設置.png',
                        title: '設置',
                      ),
                    ],
                  )
              ),
            ),
            //相機 --也可以嘗試用Positioned實現(xiàn)
            Container(
              // 可以專門抽出一個文件配置這些 顏色 margin 等變量,color: Colors.red, Top Margin 40
              margin: EdgeInsets.only(top: 40, right: 15),
              height: 25,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.end, //主軸方向在右側(cè)
                children: [
                  Image(image: AssetImage('images/相機.png')),
                ],
              ),
            ),
          ],//
        ),
      ),
    );
  }
}
運行效果

我的頁面頭部

我的頁面頭部染突,自定義小部件headerWidget開發(fā)

  • 獲取屏幕寬度MediaQuery.of(context).size.width
Widget headerWidget() {
    return Container(
      height: 200,
      color: Colors.white,
      child: Container(
        child: Container(
          margin: EdgeInsets.only(top: 100, bottom: 20, left: 20, right: 10),
          // color: Colors.red,
          child: Row(
            children: [
              //頭像
              Container(
                width: 70,
                height: 70,
                decoration: BoxDecoration(
                    color: Colors.blue,
                    borderRadius: BorderRadius.circular(12),
                    image: DecorationImage(
                        image: AssetImage('images/Hank.png'),
                        fit: BoxFit.cover)),
              ),
              //右邊的部分,包一個Expanded,懶得算了辈灼。
              Expanded(
                  child: Container(
                    // color: Colors.red,
                    // margin:
                    //     EdgeInsets.only(top: 10, bottom: 10, left: 10, right: 5),
                    // width: MediaQuery.of(context).size.width - 100,
                    padding: EdgeInsets.only(left: 10, top: 8),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        Container(
                          height: 35,
                          child: Text(
                            'HK',
                            style: TextStyle(fontSize: 25, color: Colors.black),
                          ),
                        ), //昵稱
                        Container(
                          height: 35,
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: <Widget>[
                              Text(
                                '微信號:12334',
                                style: TextStyle(fontSize: 17, color: Colors.grey),
                              ),
                              Image(
                                image: AssetImage('images/icon_right.png'),
                                width: 15,
                              )
                            ],
                          ),
                        ), //微信號+箭頭
                      ],
                    ),
                  )),
            ],
          ),
        ),
      ),
    );
  }
運行效果
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末份企,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子巡莹,更是在濱河造成了極大的恐慌司志,老刑警劉巖甜紫,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骂远,居然都是意外死亡囚霸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門激才,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拓型,“玉大人,你說我怎么就攤上這事瘸恼×哟欤” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵东帅,是天一觀的道長压固。 經(jīng)常有香客問我,道長靠闭,這世上最難降的妖魔是什么帐我? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮愧膀,結果婚禮上焚刚,老公的妹妹穿的比我還像新娘。我一直安慰自己扇调,他們只是感情好矿咕,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狼钮,像睡著了一般碳柱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熬芜,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天莲镣,我揣著相機與錄音,去河邊找鬼涎拉。 笑死瑞侮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鼓拧。 我是一名探鬼主播半火,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼季俩!你這毒婦竟也來了钮糖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤酌住,失蹤者是張志新(化名)和其女友劉穎店归,沒想到半個月后阎抒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡消痛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年且叁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秩伞。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡逞带,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稠歉,到底是詐尸還是另有隱情掰担,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布怒炸,位于F島的核電站带饱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏阅羹。R本人自食惡果不足惜勺疼,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捏鱼。 院中可真熱鬧执庐,春花似錦、人聲如沸导梆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽看尼。三九已至递鹉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藏斩,已是汗流浹背躏结。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狰域,地道東北人媳拴。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像兆览,于是被迫代替她去往敵國和親屈溉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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