Flutter中的IntrinsicHeight

一书闸、IntrinsicHeight

1.在最壞的情況下阿弃,這個(gè)渲染對(duì)象可能導(dǎo)致樹深度為 O(N2) 的時(shí)間復(fù)雜度擂涛。IntrinsicHeight 會(huì)觸發(fā) 渲染樹中其所有子樹節(jié)點(diǎn)getMaxIntrinsicHeight 方法來(lái)獲取尺寸窄赋。

2.通過源碼可知:在父級(jí)約束是緊約束的情況下 IntrinsicHeight毫無(wú)作用的被芳。

3.IntrinsicHeight 的功能實(shí)現(xiàn),就是通過為子級(jí)在高度上施加緊約束實(shí)現(xiàn)的樱拴。

二柠衍、時(shí)光軸

時(shí)光軸.png

思路:左邊的直線和虛線圓點(diǎn)都是都是通過自定義Decoration實(shí)現(xiàn)的洋满,右邊的內(nèi)容可以自定義,我這邊就是放了個(gè)顏色塊珍坊。因?yàn)橛疫叺母叨炔欢ㄎ矗瑢?dǎo)致左邊的直線高度不定,這里采用IntrinsicHeight套在頂層阵漏,就可以讓左邊的widget跟隨右邊的高度變化驻民。

三、自定義Decoration

1.寫個(gè)類實(shí)現(xiàn)Decoration

@override
BoxPainter createBoxPainter([VoidCallback? onChanged]) {
  return DashBoxPainter(decoration: this);
}

2.他需要BoxPainter履怯,也需要實(shí)現(xiàn)一個(gè)類


///Offset 表示左上角的位置回还,configuration.size是可以拿到對(duì)應(yīng)的控件大小的
@override
void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {
}

四、整體的代碼實(shí)現(xiàn)

import 'package:dash_painter/dash_painter.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class TimeLineNode extends StatelessWidget {
  double contentHeight;
   TimeLineNode({Key? key, required this.contentHeight}) : super(key: key);

  final double marginTop = 10;
  final double dashLineWidth = 20;
  final double offset = 20 + 10;
  final double lineWidth = 2;
  final double circleRadius = 5;

  @override
  Widget build(BuildContext context) {
    return IntrinsicHeight(
      child: Row(
        children: [
          _buildDecoration(),
           Expanded(
              flex: 5,
              child: Container(
                color:  Colors.red,
                height: contentHeight,
              )),
          const Spacer(
            flex: 2,
          )
        ],
      ),
    );
  }

  Widget _buildDecoration() {
    return Container(
      margin: const EdgeInsets.only(left: 20),
      width: dashLineWidth,

      ///不用寫高叹洲,因?yàn)楦吒鶕?jù)布局最大顯示
      decoration: DashDecoration(
          circleColor: Colors.blueAccent,
          lineColor: Colors.white,
          circleRadius: circleRadius,
          color: Colors.white,
          circleOffset: Offset(lineWidth / 2, offset + 10 / 2)),
    );
  }
}

class DashDecoration extends Decoration {
  final Color color;
  final Color circleColor;
  final Color lineColor;
  final Offset circleOffset;
  final double circleRadius;

  const DashDecoration(
      {required this.color,
      required this.circleColor,
      required this.lineColor,
      required this.circleOffset,
      required this.circleRadius});

  @override
  BoxPainter createBoxPainter([VoidCallback? onChanged]) {
    return DashBoxPainter(decoration: this);
  }
}

class DashBoxPainter extends BoxPainter {
  final DashDecoration decoration;

  const DashBoxPainter({required this.decoration});

  ///Offset 表示左上角的位置柠硕,configuration.size是可以拿到對(duì)應(yīng)的控件大小的
  @override
  void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {
    canvas.save();
    final Paint paint = Paint()..style = PaintingStyle.stroke;
    final Path path = Path();

    // canvas.drawCircle(offset, 5, Paint()..color = Colors.blue);
    debugPrint("offset ${offset.dx}  dy : ${offset.dy}");

    ///為什么上面canvas需要保存,這里的canvas有平移
    canvas.translate(offset.dx, offset.dy);
    // canvas.drawCircle(offset, 5, Paint()..color = Colors.yellow);
    //繪制直線
    canvas.drawLine(
        Offset(-decoration.circleOffset.dx, -decoration.circleOffset.dy),
        Offset(-decoration.circleOffset.dx, configuration.size!.height),
        paint
          ..color = decoration.lineColor
          ..strokeWidth = 2);

    //繪制虛線
    path
      ..moveTo(0, decoration.circleOffset.dy)
      ..relativeLineTo(configuration.size!.width, 0);

    const DashPainter(span:2,step:3).
    paint(canvas, path, paint..color = decoration.color..strokeWidth =1);

    //繪制圓點(diǎn)
    final Paint paint2 = Paint()..color = Colors.white;
    canvas.drawCircle(
        Offset(decoration.circleOffset.dx, decoration.circleOffset.dy),
        decoration.circleRadius,
        paint2);
    canvas.drawCircle(
        Offset(decoration.circleOffset.dx, decoration.circleOffset.dy),
        decoration.circleRadius * 0.6,
        paint2..color = decoration.circleColor);

    canvas.restore();
  }
}

調(diào)用代碼

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
      ),
      // home:  OverlayPage(),
      home:  Scaffold(
          backgroundColor: Colors.black,
          body: Container(
          margin: const EdgeInsets.only(top: 46),
          child: Column(children :  [
          TimeLineNode(contentHeight:50),
          const SizedBox(height: 10,),
          TimeLineNode(contentHeight:100),
            const SizedBox(height: 10,),
          TimeLineNode(contentHeight:150),
          ]))),


    );
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末运提,一起剝皮案震驚了整個(gè)濱河市蝗柔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌民泵,老刑警劉巖癣丧,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異栈妆,居然都是意外死亡胁编,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門鳞尔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嬉橙,“玉大人,你說我怎么就攤上這事铅檩≡饕模” “怎么了莽鸿?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵昧旨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我祥得,道長(zhǎng)兔沃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任级及,我火速辦了婚禮乒疏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饮焦。我一直安慰自己怕吴,他們只是感情好窍侧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著转绷,像睡著了一般伟件。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上议经,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天斧账,我揣著相機(jī)與錄音,去河邊找鬼煞肾。 笑死咧织,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的籍救。 我是一名探鬼主播习绢,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝙昙!你這毒婦竟也來(lái)了毯炮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耸黑,失蹤者是張志新(化名)和其女友劉穎桃煎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體大刊,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡为迈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缺菌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葫辐。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伴郁,靈堂內(nèi)的尸體忽然破棺而出耿战,到底是詐尸還是另有隱情,我是刑警寧澤焊傅,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布剂陡,位于F島的核電站,受9級(jí)特大地震影響狐胎,放射性物質(zhì)發(fā)生泄漏鸭栖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一握巢、第九天 我趴在偏房一處隱蔽的房頂上張望晕鹊。 院中可真熱鬧,春花似錦、人聲如沸溅话。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)飞几。三九已至带射,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間循狰,已是汗流浹背窟社。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绪钥,地道東北人灿里。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像程腹,于是被迫代替她去往敵國(guó)和親匣吊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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