Flutter 27: 圖解 ListView/GridView 混用時滑動沖突小嘗試

??????小菜在學(xué)習(xí)過程中會在一個 Page 頁面同時用到 GridView 和 ListView 或多個 ListView蒋荚,此時就會遇到常見的滑動沖突問題铐尚。小菜嘗試了兩種解決滑動沖突的方案,僅記錄一下基本的使用方式摹闽。小菜翻譯很不到位,可重點看代碼蹈胡。

嘗試一:CustomScrollView + sliver

??????Flutter 提供了類似于 Android CollapsingToolbarLayout 的折疊效果皂贩,小菜借此了解到 CustomScrollView 這個組件罐寨,可以解決列表的滑動沖突。

??????CustomScrollView 允許包含多種滾動模型纵柿,例如列表/網(wǎng)格和擴展標題蜈抓。但其子 Widget 必須為 sliver 類型的。

??????sliver 代表具有特定滾動效果的滾動模型昂儒,sliver 本身不包含滾動交互模型沟使,需要通過 CustomScrollView 連接為一個整體荆忍。sliver 有眾多具體的 Widget格带,小菜也在嘗試過程中。

class _ScrollPageState extends State<ScrollPage3> {
  List<int> gridData = List<int>();

  _setGridData() {
    for (int i = 0; i < 15; i++) {
      gridData.add(i);
    }
  }

  @override
  void initState() {
    _setGridData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(appBar: AppBar(title: Text('方案一')), body: _bodyWid());
  }

  Widget _bodyWid() {
    return CustomScrollView(slivers: <Widget>[
      SliverList(
          delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
        return _typeTitleWid('熱門分類');
      }, childCount: 1)),
      SliverPadding(padding: const EdgeInsets.all(8.0), sliver: _typeGridWid()),
      SliverList(
          delegate:
              SliverChildBuilderDelegate((BuildContext context, int index) {
        return _typeTitleWid('智能推薦');
      }, childCount: 1)),
      _typeListWid()
    ]);
  }

  Widget _typeTitleWid(var titleStr) {
    return Container(
        color: Colors.white,
        child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            mainAxisSize: MainAxisSize.max,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Padding( padding: EdgeInsets.all(10.0),
                  child: Text(titleStr,
                      style:
                          TextStyle(color: Color(0xFF808080), fontSize: 14.0))),
              Divider(color: Color(0xFF808080), height: 0.5)
            ]));
  }

  Widget _typeGridWid() {
    return SliverGrid(
        gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 4, mainAxisSpacing: 8.0,
            crossAxisSpacing: 8.0, childAspectRatio: 4.0),
        delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
          return Container( height: 64.0,
              decoration: BoxDecoration(
                  color: Colors.grey, borderRadius: BorderRadius.circular(3.0)),
              child: Center(
                  child: Text('分類 ${(index + 1)}', style: TextStyle(color: Color(0xFF333333), fontSize: 14.0))));
        }, childCount: gridData.length));
  }

  Widget _typeListWid() {
    return SliverFixedExtentList(
        itemExtent: 50.0,
        delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
          return Container(
              child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    mainAxisSize: MainAxisSize.max,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Padding(
                          padding: EdgeInsets.all(10.0),
                          child: Text('推薦精彩內(nèi)容 ${(index + 1)}',
                              textAlign: TextAlign.left,
                              style: TextStyle(
                                  color: Color(0xFF333333), fontSize: 15.0))),
                Padding(
                    padding: EdgeInsets.only(top: 4.0),
                    child: Divider(color: Color(0xFF808080), height: 0.5))
              ]));
        }, childCount: gridData.length));
  }
}

嘗試二:primary + shrinkWrap

??????小菜在使用 ListViewGridView 時發(fā)現(xiàn)有兩個屬性很重要刹枉。小菜的翻譯很不到位叽唱,建議大家仔細閱讀一下官網(wǎng)的介紹。

??????shrinkWrap 常用于內(nèi)容大小不確定情況微宝,如果滾動視圖(ListView/GridView/ScrollView 等)沒有收縮包裝棺亭,則滾動視圖將擴展到允許的最大大小。如果是無界約束蟋软,則 shrinkWrap 必須為 true镶摘。

??????primary 如果為 true,即使?jié)L動視圖沒有足夠的內(nèi)容來支撐滾動岳守,滾動視圖也是可滾動的凄敢。否則,默認為 false 情況下湿痢,只有具有足夠內(nèi)容的用戶才能滾動視圖涝缝。

class _ScrollPageState extends State<ScrollPage3> {
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(appBar: AppBar(title: Text('方案二')), body: _bodyWid2());
  }

  Widget _typeGridWid2() {
    return GridView.count(
        primary: false,
        shrinkWrap: true,
        crossAxisCount: 4,
        mainAxisSpacing: 8.0,
        crossAxisSpacing: 8.0,
        childAspectRatio: 4.0,
        padding: EdgeInsets.all(10.0),
        children: gridData.map((int index) {
          return Container(
              height: 64.0,
              decoration: BoxDecoration(
                  color: Colors.grey, borderRadius: BorderRadius.circular(3.0)),
              child: Center(
                  child: Text('分類 ${(index + 1)}',
                      style: TextStyle(
                          color: Color(0xFF333333), fontSize: 14.0))));
        }).toList());
  }

  Widget _typeListWid2() {
    return ListView.separated(
        primary: false,
        shrinkWrap: true,
        itemCount: gridData.length,
        separatorBuilder: (BuildContext context, int index) => new Divider(),
        itemBuilder: (context, item) {
          return Padding(
              padding: EdgeInsets.all(12.0),
              child: Text('推薦精彩內(nèi)容 ${(item + 1)}',
                  style: TextStyle(color: Color(0xFF333333), fontSize: 15.0)));
        });
  }

  Widget _bodyWid2() {
    return ListView(children: <Widget>[
      _typeTitleWid('熱門分類'),
      _typeGridWid2(),
      _typeTitleWid('智能推薦'),
      _typeListWid2()
    ]);
  }
}

??????小菜的學(xué)習(xí)還很不到位扑庞,如果有不對的地方還希望多多指出。

來源:阿策小和尚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拒逮,一起剝皮案震驚了整個濱河市罐氨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滩援,老刑警劉巖栅隐,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玩徊,居然都是意外死亡租悄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門佣赖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恰矩,“玉大人,你說我怎么就攤上這事憎蛤。” “怎么了纪吮?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵俩檬,是天一觀的道長。 經(jīng)常有香客問我碾盟,道長棚辽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任冰肴,我火速辦了婚禮屈藐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熙尉。我一直安慰自己联逻,他們只是感情好,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布检痰。 她就那樣靜靜地躺著包归,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铅歼。 梳的紋絲不亂的頭發(fā)上公壤,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音椎椰,去河邊找鬼厦幅。 笑死,一個胖子當著我的面吹牛慨飘,可吹牛的內(nèi)容都是我干的确憨。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缚态!你這毒婦竟也來了磁椒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤玫芦,失蹤者是張志新(化名)和其女友劉穎浆熔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桥帆,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡医增,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了老虫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叶骨。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖祈匙,靈堂內(nèi)的尸體忽然破棺而出忽刽,到底是詐尸還是另有隱情,我是刑警寧澤夺欲,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布跪帝,位于F島的核電站,受9級特大地震影響些阅,放射性物質(zhì)發(fā)生泄漏伞剑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一市埋、第九天 我趴在偏房一處隱蔽的房頂上張望黎泣。 院中可真熱鬧,春花似錦缤谎、人聲如沸抒倚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衡便。三九已至,卻和暖如春洋访,著一層夾襖步出監(jiān)牢的瞬間镣陕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工姻政, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呆抑,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓汁展,卻偏偏與公主長得像鹊碍,于是被迫代替她去往敵國和親厌殉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

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

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程侈咕,因...
    小菜c閱讀 6,451評論 0 17
  • 內(nèi)容 抽屜菜單 ListView WebView SwitchButton 按鈕 點贊按鈕 進度條 TabLayo...
    小狼W閱讀 1,614評論 0 10
  • 2018.11.08 星期四 天氣陰 不知不覺耀销,已經(jīng)畢業(yè)了一年多楼眷,在這一年半的時間里,發(fā)生了太多的事情熊尉,從南到北罐柳,...
    青歌辭閱讀 443評論 0 1
  • 中午下樓,不餓 一支煙的空隙狰住,這個時間讓我放空自己张吉,忘掉身上的壓力。 比起肺里的翻騰催植,我更喜歡看著煙霧肮蛹。 像是一位...
    浪跡音樂廳閱讀 207評論 0 0
  • 夢蔗崎,每個人都有。 有夢想之夢扰藕,亦有做夢之夢。夢想是個美好的東西芳撒,做夢卻是美丑參半邓深。有夢想的人是年輕...
    楊宇塵閱讀 740評論 0 1