Flutter 自定義組件實(shí)戰(zhàn)之Cupertino(iOS)風(fēng)格的復(fù)選框

繼上一篇Flutter自定義組件的視頻短課(視頻地址: https://www.bilibili.com/video/BV1ap4y1U7UB/ )后,我們繼續(xù)來(lái)聊自定義組件。視頻中我為大家詳解了Cupertino風(fēng)格的單選框的實(shí)現(xiàn),這次我們就說(shuō)說(shuō)Cupertino風(fēng)格的復(fù)選框。我們先來(lái)看看效果:

未勾選狀態(tài)

勾選后狀態(tài)

如上兩圖所示,第一張圖是未選中的狀態(tài),第二張圖是勾選后的狀態(tài),在點(diǎn)擊時(shí)有點(diǎn)擊效果。為了方便大家看出效果,我特意放大了組件大小。
其實(shí)很簡(jiǎn)單,整個(gè)組件就是Container和Icon組成的。Container是圓角矩形邊框和背景色,icon是中間的對(duì)勾。另外,還有一個(gè)CupertinoButton組件將它們包裹進(jìn)去,實(shí)現(xiàn)點(diǎn)擊事件的響應(yīng)以及點(diǎn)擊效果,以及一個(gè)布爾變量isChecked表示選中狀態(tài)。
我們直接看代碼:

CupertinoButton(
    child: Container(
        decoration: BoxDecoration(
            color: isChecked
                ? CupertinoColors.systemGreen
                : CupertinoColors.white,
            border: Border.all(
                color: CupertinoColors.systemGrey,
                style: BorderStyle.solid,
                width: 1),
            borderRadius: BorderRadius.all(Radius.circular(5))),
        child: Icon(CupertinoIcons.check_mark,
            size: 100,
            color: isChecked
                ? CupertinoColors.white
                : CupertinoColors.systemGrey),
    ),
    onPressed: () {
        setState(() {
            isChecked = !isChecked;
        });
    }
)

怎么樣?很簡(jiǎn)單吧?不過(guò),這里還有一個(gè)坑。
在實(shí)際應(yīng)用中,不可能吧一個(gè)復(fù)選框設(shè)定到100大小,當(dāng)把它設(shè)置為足夠小的時(shí)候,Button的點(diǎn)擊事件會(huì)在復(fù)選框外還會(huì)響應(yīng)。這是因?yàn)镃upertinoButton中有一個(gè)屬性,叫做minSize。通過(guò)閱讀源碼,我們發(fā)現(xiàn)它有一個(gè)預(yù)設(shè)值:kMinInteractiveDimensionCupertino,值為44.0。
換言之,如果我們的復(fù)選框大小比44小(實(shí)際上大多數(shù)情況皆如此)時(shí),用戶點(diǎn)擊復(fù)選框外部時(shí),也會(huì)響應(yīng)。所以,我們還需要給定minSize大小,至少是和icon組件的大小一致,或更小。
好了,本篇文章的內(nèi)容到這里就結(jié)束了,希望能夠幫到你。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容