flutter 類似物流跟蹤節(jié)點 豎線

前言

學習flutter差不多用了一個月的時間没佑,剛好最近公司啟動了一個新項目百姓,本人決定使用flutter開發(fā)楣颠,兩個星期寫UI兩個星期寫接口,現(xiàn)在已經(jīng)進入測試階段夏志,總結一下項目中值得記錄的部分

UI效果圖

效果圖.png

flutter實現(xiàn)效果圖

image.png

其實也就是中間那部分該如何實現(xiàn)的問題乃坤?

具體實現(xiàn)

image.png
  • 分析
    • 每個item 對應為row 一行
    • 這個 row 分為左右結構,如圖藍色部分

為了簡化代買沟蔑,我把項目中的代碼拆出來湿诊,寫了demo,下面的代碼可以直接復制到demo中可直接運行

代碼實現(xiàn)

import 'dashed_line_widget.dart';
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  List<String>dataList = [
    '這些年瘦材, 習近平主席視察部隊時接見最多的是基層一線官兵厅须, 從北疆哨所到南國林海, 從戈壁大漠到海防一線宇色, 習主席每次走進基層總是與士兵親切交談九杂, 他很關心戰(zhàn)士們的生活颁湖, 拉家常宣蠕、 問冷暖。 對官兵甥捺, 習主席有一種天然的親近感抢蚀。 他年輕時在軍隊工作過一段時間, 在擔任地方領導期間十分關心支持國防和軍隊建設镰禾, 曾深情賦詩“ 難得舉城作一慶皿曲, 愛我人民愛我軍',
    '習近平主席多次強調(diào):“ 實現(xiàn)強軍目標, 基礎在基層吴侦, 活力也在基層屋休。” 基層是部隊建設和戰(zhàn)斗力的基礎备韧。 黨的十八大以來劫樟, 習主席數(shù)十次深入基層部隊視察調(diào)研, 踏冰雪、 冒嚴寒叠艳、 到一線奶陈, 基層戰(zhàn)士始終是習主席心中最深的牽掛。',
    '潛客狀態(tài)變化'
  ];
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body:_grayCenter(context),

    );
  }

  //灰色部分
  Widget _grayCenter(BuildContext context){

    List<Widget> widgets = [];
    for(String followupList in dataList){
      Widget widget = _getRow(followupList);
      widgets.add(widget);
    }

    print(widgets);

    return Container(
      width: double.infinity,

      decoration: BoxDecoration(
        color: Color(0xFFF7F9FA),
        borderRadius: BorderRadius.circular(3),
      ),
      padding: EdgeInsets.only(left: 0,right: 15,top: 15,bottom: 15),
      child: Column(
        children:widgets,
      ),
    );
  }

  Widget _getRow(String followupListItem){

    String timestr = DateTime.now().toString().substring(0,10);

    Widget firstRow;
    Widget contentWidget = SizedBox();
    //跟進記錄
    contentWidget = Text(
      followupListItem??"--",
      style: TextStyle(
        fontSize: 12,
      ),
      softWrap: true,
    );

    firstRow = Row(
      children: <Widget>[
        Text(
          timestr,
          style: TextStyle(
              fontSize: 12.0,
         )
        )
      ],
    );

    Widget pointWidget;
    double topSpace = 0;
    topSpace = 3;
    pointWidget = ClipOval(
      child: Container(
        width: 7,
        height: 7,
        color: Colors.grey,
      ),
    );

    return Row(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        //灰色右
        Expanded(
          child: Stack(
            children: <Widget>[
              Container(
                padding: EdgeInsets.only(left: 37),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    SizedBox(
                      height: topSpace==0?4:0,
                    ),
                    firstRow,
                    SizedBox(
                      height: 12.0,
                    ),
                    contentWidget,
                    SizedBox(
                      height: 12.0,
                    ),
                  ],
                ),
              ),
              Positioned(
                left: 0,
                width: 37,
                bottom: 0,
                top: topSpace,
                child: Container(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: <Widget>[
                      pointWidget,
                      Expanded(
                        child: Container(
                          width: 27,
                          child: MySeparatorVertical(
                            color: Colors.grey,
                          ),
                        ),
                      )
                    ],
                  ),
                ),
              )
            ],
          ),
        ),
      ],
    );
  }
}

dashed_line_widget.dart

import 'package:flutter/material.dart';

class MySeparatorVertical extends StatelessWidget {
  final Color color;

  const MySeparatorVertical({this.color = Colors.black});

  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(
      builder: (BuildContext context, BoxConstraints constraints) {
        final height = constraints.constrainHeight();
        final dashWidth = 4.0;
        final dashCount = (height / (2 * dashWidth)).floor();
        print("dashCount $dashCount  height $height");

        return Flex(
          children: List.generate(dashCount, (_) {
            return SizedBox(
              width: 1,
              height: dashWidth,
              child: DecoratedBox(
                decoration: BoxDecoration(color: color),
              ),
            );
          }),
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          direction: Axis.vertical,
        );
      },
    );
  }
}

運行出來的效果

image.png

總結

  • 其實就是利用了stack 與 position 的特性自動獲取右側文字的大小
  • LayoutBuilder 獲取constraints 大小
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末附较,一起剝皮案震驚了整個濱河市吃粒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拒课,老刑警劉巖徐勃,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異早像,居然都是意外死亡疏旨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門扎酷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檐涝,“玉大人,你說我怎么就攤上這事法挨∷瘢” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵凡纳,是天一觀的道長窃植。 經(jīng)常有香客問我,道長荐糜,這世上最難降的妖魔是什么巷怜? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮暴氏,結果婚禮上延塑,老公的妹妹穿的比我還像新娘。我一直安慰自己答渔,他們只是感情好关带,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沼撕,像睡著了一般宋雏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上务豺,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天磨总,我揣著相機與錄音,去河邊找鬼笼沥。 笑死蚪燕,一個胖子當著我的面吹牛招狸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邻薯,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼裙戏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厕诡?” 一聲冷哼從身側響起累榜,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灵嫌,沒想到半個月后壹罚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡寿羞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年猖凛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绪穆。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡辨泳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玖院,到底是詐尸還是另有隱情菠红,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布难菌,位于F島的核電站试溯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏郊酒。R本人自食惡果不足惜遇绞,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望燎窘。 院中可真熱鬧摹闽,春花似錦、人聲如沸荠耽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铝量。三九已至,卻和暖如春银亲,著一層夾襖步出監(jiān)牢的瞬間慢叨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工务蝠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拍谐,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像轩拨,于是被迫代替她去往敵國和親践瓷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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

  • 國慶后面兩天在家學習整理了一波flutter亡蓉,基本把能擼過能看到的代碼都過了一遍晕翠,此文篇幅較長,建議保存(star...
    Nealyang閱讀 4,338評論 1 17
  • 目錄 一砍濒、Flutter 為何使用Dart開發(fā)語言二淋肾、Flutter的UI系統(tǒng)1.特點2.架構簡介2.1 Flut...
    十拿九穩(wěn)啦閱讀 3,632評論 3 28
  • 文/向上 今夜無眠思如線, 星月互望共寒天爸邢。 殘荷披雪挺冰湖樊卓, 君在遠鄉(xiāng)何時回? 冬雨欲涼我心口杠河, 遙知距春許多日...
    A向上閱讀 1,606評論 27 73
  • 箴言1:1-9 這是以色列王大衛(wèi)的兒子券敌,所羅門的慧語——記下來是讓我們知道怎樣活得好和活的對七扰,明白人生的意義和去向...
    paulxqf閱讀 309評論 0 0