Flutter學(xué)習(xí)筆記 -- 5星評(píng)級(jí)組件


Flutter實(shí)現(xiàn): 5星評(píng)分的展示的小組件 -- 支持不同數(shù)量的星星名斟、顏色、大小等

import 'package:flutter/material.dart';

main() {
  return runApp(XMHomePage());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("5星評(píng)級(jí)"),),
        body: Center(child: XMStartRating(rating: 8.9,),),
      ),
    );
  }
}

/// 5星評(píng)分的展示的小組件 -- 支持不同數(shù)量的星星孝鹊、顏色、大小等
class XMStartRating extends StatelessWidget {
  final int count; // 星星的數(shù)量,默認(rèn)是5個(gè)
  final double rating; // 獲得的分?jǐn)?shù)
  final double totalRating; // 總分?jǐn)?shù)
  final Color unSelectColor; // 未選中的顏色
  final Color selectColor; // 選中的顏色
  final double size; // 星星的大小
  final double spacing; // 星星間的間隙
  // 自定義構(gòu)造函數(shù)
  XMStartRating({
    required this.rating,
    this.totalRating = 10,
    this.unSelectColor = Colors.grey,
    this.selectColor = Colors.red,
    this.size = 30,
    this.count = 5,
    this.spacing = 2,
  });

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.green,
      child: Row(
        mainAxisSize: MainAxisSize.min,
        children: [
          Stack(
            children: [
              getUnSelectStarWidget(),
              getSelectStarWidget()
            ],
          ),
          Padding(
            padding: const EdgeInsets.only(left: 5),
            child: Text("${this.rating}分",style: TextStyle(fontSize: 20),),
          ),
        ],
      ),
    );
  }

  // 獲取背景:未填充的星星
  List<Widget> _getUnSelectStars() {
    return List<Widget>.generate(this.count, (index) {
      return Icon(Icons.star_outline_rounded,size: size,color: unSelectColor,);
    });
  }

  // 填充星星
  List<Widget> _getSelectStars() {
    return List<Widget>.generate(this.count, (index) {
      return Icon(Icons.star, size: size, color: selectColor,);
    });
  }

  // 獲取背景星星的組件
  Widget getUnSelectStarWidget() {
    return  Wrap(
      spacing: this.spacing,
      alignment: WrapAlignment.spaceBetween,
      children: _getUnSelectStars(),
    );
  }

  // 獲取針對(duì)整個(gè)選中的星星裁剪的組件
  Widget getSelectStarWidget() {
   // 應(yīng)該展示幾個(gè)星星 --- 例如:4.6個(gè)星星
    final double showStarCount = this.count * (this.rating/this.totalRating);
    final int fillStarCount = showStarCount.floor();// 滿星的數(shù)量
    final double halfStarCount = showStarCount - fillStarCount; // 半星的數(shù)量
    // 最終需要裁剪的寬度
    final double clipWith = fillStarCount*(this.size + this.spacing) + halfStarCount*this.size;

    return ClipRect(
      clipper: XMStarClipper(clipWith),
      child: Container(
          child: Wrap(
            spacing: this.spacing,
            alignment: WrapAlignment.spaceBetween,
            children: _getSelectStars(),
          ),
        ),
    );
  }
}
// 獲取裁剪過的星星
class XMStarClipper extends CustomClipper<Rect> {
  double clipWidth;
  XMStarClipper(this.clipWidth);

  @override
  Rect getClip(Size size) {
    return Rect.fromLTRB(0, 0, clipWidth, size.height);
  }
  @override
  bool shouldReclip(XMStarClipper oldClipper) {
    // TODO: implement shouldReclip
    return clipWidth != oldClipper.clipWidth;
  }
}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宗苍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子薄榛,更是在濱河造成了極大的恐慌浓若,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛇数,死亡現(xiàn)場離奇詭異挪钓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耳舅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門碌上,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浦徊,你說我怎么就攤上這事馏予。” “怎么了盔性?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵霞丧,是天一觀的道長。 經(jīng)常有香客問我冕香,道長蛹尝,這世上最難降的妖魔是什么后豫? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮突那,結(jié)果婚禮上挫酿,老公的妹妹穿的比我還像新娘。我一直安慰自己愕难,他們只是感情好早龟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猫缭,像睡著了一般葱弟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猜丹,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天芝加,我揣著相機(jī)與錄音,去河邊找鬼居触。 笑死妖混,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的轮洋。 我是一名探鬼主播制市,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弊予!你這毒婦竟也來了祥楣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤汉柒,失蹤者是張志新(化名)和其女友劉穎误褪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碾褂,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兽间,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了正塌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘀略。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乓诽,靈堂內(nèi)的尸體忽然破棺而出帜羊,到底是詐尸還是另有隱情,我是刑警寧澤鸠天,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布讼育,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奶段。R本人自食惡果不足惜饥瓷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忧饭。 院中可真熱鬧扛伍,春花似錦筷畦、人聲如沸词裤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吼砂。三九已至,卻和暖如春鼎文,著一層夾襖步出監(jiān)牢的瞬間渔肩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工拇惋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留周偎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓撑帖,卻偏偏與公主長得像蓉坎,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胡嘿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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