diff --git a/lib/common/assets.dart b/lib/common/assets.dart new file mode 100644 index 000000000..97996d364 --- /dev/null +++ b/lib/common/assets.dart @@ -0,0 +1,56 @@ +abstract final class Assets { + static const digitalNum = 'digital_id_num'; + + static const logo = 'assets/images/logo/logo.png'; + static const logo2 = 'assets/images/logo/logo_2.png'; + static const logoIco = 'assets/images/logo/ico/app_icon.ico'; + static const logoLarge = 'assets/images/logo/desktop/logo_large.png'; + + static const vipIcon = 'assets/images/big-vip.png'; + static const avatarPlaceHolder = 'assets/images/noface.jpeg'; + static const loading = 'assets/images/loading.png'; + static const buffering = 'assets/images/loading.webp'; + static const play = 'assets/images/play.png'; + static const topicHeader = 'assets/images/topic-header-bg.png'; + static const trendingBanner = 'assets/images/trending_banner.png'; + static const ai = 'assets/images/ai.png'; + + static const livingChart = 'assets/images/live.gif'; + static const livingStatic = 'assets/images/live.png'; + static const livingRect = 'assets/images/live/live.gif'; + static const livingBackground = 'assets/images/live/default_bg.webp'; + + static const thunder1 = 'assets/images/paycoins/ic_thunder_1.png'; + static const thunder2 = 'assets/images/paycoins/ic_thunder_2.png'; + static const thunder3 = 'assets/images/paycoins/ic_thunder_3.png'; + static const notEnough = 'assets/images/paycoins/ic_22_not_enough_pay.png'; + static const mario = 'assets/images/paycoins/ic_22_mario.png'; + static const gunSister = 'assets/images/paycoins/ic_22_gun_sister.png'; + static const payBox = 'assets/images/paycoins/ic_pay_coins_box.png'; + static const coinsOne = 'assets/images/paycoins/ic_coins_one.png'; + static const coinsTwo = 'assets/images/paycoins/ic_coins_two.png'; + static const left = 'assets/images/paycoins/ic_left.png'; + static const leftDisable = 'assets/images/paycoins/ic_left_disable.png'; + static const right = 'assets/images/paycoins/ic_right.png'; + static const rightDisable = 'assets/images/paycoins/ic_right_disable.png'; + static const panelClose = 'assets/images/paycoins/ic_panel_close.png'; + + static const List mpvAnime4KShaders = [ + 'Anime4K_Clamp_Highlights.glsl', + 'Anime4K_Restore_CNN_VL.glsl', + 'Anime4K_Upscale_CNN_x2_VL.glsl', + 'Anime4K_AutoDownscalePre_x2.glsl', + 'Anime4K_AutoDownscalePre_x4.glsl', + 'Anime4K_Upscale_CNN_x2_M.glsl', + ]; + + static const mpvAnime4KShadersLite = [ + 'Anime4K_Clamp_Highlights.glsl', + 'Anime4K_Restore_CNN_M.glsl', + 'Anime4K_Restore_CNN_S.glsl', + 'Anime4K_Upscale_CNN_x2_M.glsl', + 'Anime4K_AutoDownscalePre_x2.glsl', + 'Anime4K_AutoDownscalePre_x4.glsl', + 'Anime4K_Upscale_CNN_x2_S.glsl', + ]; +} diff --git a/lib/common/constants.dart b/lib/common/constants.dart index 51215f70f..25f5dc680 100644 --- a/lib/common/constants.dart +++ b/lib/common/constants.dart @@ -1,30 +1,3 @@ -import 'package:flutter/material.dart'; - -abstract final class StyleString { - static const double cardSpace = 8; - static const double safeSpace = 12; - static const BorderRadius mdRadius = BorderRadius.all(imgRadius); - static const Radius imgRadius = Radius.circular(10); - static const double aspectRatio = 16 / 10; - static const double aspectRatio16x9 = 16 / 9; - static const double imgMaxRatio = 2.6; - static const bottomSheetRadius = BorderRadius.vertical( - top: Radius.circular(18), - ); - static const dialogFixedConstraints = BoxConstraints( - minWidth: 420, - maxWidth: 420, - ); - static const topBarHeight = 52.0; - static const buttonStyle = ButtonStyle( - visualDensity: VisualDensity( - horizontal: -2, - vertical: -1.25, - ), - tapTargetSize: .shrinkWrap, - ); -} - abstract final class Constants { static const appName = 'PiliPlus'; static const sourceCodeUrl = 'https://github.com/bggRGjQaUbCoE/PiliPlus'; @@ -68,244 +41,4 @@ abstract final class Constants { // 'itemOpusStyle,opusBigCover,onlyfansVote,endFooterHidden,decorationCard,onlyfansAssetsV2,ugcDelete,onlyfansQaCard,editable,opusPrivateVisible,avatarAutoTheme,sunflowerStyle,cardsEnhance,eva3CardOpus,eva3CardVideo,eva3CardComment,eva3CardVote,eva3CardUser' static const dynFeatures = 'itemOpusStyle,listOnlyfans,onlyfansQaCard'; - - // 超分辨率滤镜 - static const List mpvAnime4KShaders = [ - 'Anime4K_Clamp_Highlights.glsl', - 'Anime4K_Restore_CNN_VL.glsl', - 'Anime4K_Upscale_CNN_x2_VL.glsl', - 'Anime4K_AutoDownscalePre_x2.glsl', - 'Anime4K_AutoDownscalePre_x4.glsl', - 'Anime4K_Upscale_CNN_x2_M.glsl', - ]; - - // 超分辨率滤镜 (轻量) - static const mpvAnime4KShadersLite = [ - 'Anime4K_Clamp_Highlights.glsl', - 'Anime4K_Restore_CNN_M.glsl', - 'Anime4K_Restore_CNN_S.glsl', - 'Anime4K_Upscale_CNN_x2_M.glsl', - 'Anime4K_AutoDownscalePre_x2.glsl', - 'Anime4K_AutoDownscalePre_x4.glsl', - 'Anime4K_Upscale_CNN_x2_S.glsl', - ]; - - //内容来自 https://passport.bilibili.com/web/generic/country/list - static const internationalDialingPrefix = [ - (id: 1, cname: "中国大陆", countryId: 86), - (id: 5, cname: "中国香港特别行政区", countryId: 852), - (id: 2, cname: "中国澳门特别行政区", countryId: 853), - (id: 3, cname: "中国台湾", countryId: 886), - (id: 4, cname: "美国", countryId: 1), - (id: 6, cname: "比利时", countryId: 32), - (id: 7, cname: "澳大利亚", countryId: 61), - (id: 8, cname: "法国", countryId: 33), - (id: 9, cname: "加拿大", countryId: 1), - (id: 10, cname: "日本", countryId: 81), - (id: 11, cname: "新加坡", countryId: 65), - (id: 12, cname: "韩国", countryId: 82), - (id: 13, cname: "马来西亚", countryId: 60), - (id: 14, cname: "英国", countryId: 44), - (id: 15, cname: "意大利", countryId: 39), - (id: 16, cname: "德国", countryId: 49), - (id: 18, cname: "俄罗斯", countryId: 7), - (id: 19, cname: "新西兰", countryId: 64), - (id: 153, cname: "瓦利斯群岛和富图纳群岛", countryId: 1681), - (id: 152, cname: "葡萄牙", countryId: 351), - (id: 151, cname: "帕劳", countryId: 680), - (id: 150, cname: "诺福克岛", countryId: 672), - (id: 149, cname: "挪威", countryId: 47), - (id: 148, cname: "纽埃岛", countryId: 683), - (id: 147, cname: "尼日利亚", countryId: 234), - (id: 146, cname: "尼日尔", countryId: 227), - (id: 145, cname: "尼加拉瓜", countryId: 505), - (id: 144, cname: "尼泊尔", countryId: 977), - (id: 143, cname: "瑙鲁", countryId: 674), - (id: 154, cname: "格鲁吉亚", countryId: 995), - (id: 155, cname: "瑞典", countryId: 46), - (id: 165, cname: "沙特阿拉伯", countryId: 966), - (id: 164, cname: "桑给巴尔岛", countryId: 259), - (id: 163, cname: "塞舌尔共和国", countryId: 248), - (id: 162, cname: "塞浦路斯", countryId: 357), - (id: 161, cname: "塞内加尔", countryId: 221), - (id: 160, cname: "塞拉利昂", countryId: 232), - (id: 159, cname: "萨摩亚,东部", countryId: 684), - (id: 158, cname: "萨摩亚,西部", countryId: 685), - (id: 157, cname: "萨尔瓦多", countryId: 503), - (id: 156, cname: "瑞士", countryId: 41), - (id: 166, cname: "圣多美和普林西比", countryId: 239), - (id: 142, cname: "塞尔维亚", countryId: 381), - (id: 141, cname: "南非", countryId: 27), - (id: 128, cname: "毛里塔尼亚", countryId: 222), - (id: 127, cname: "毛里求斯", countryId: 230), - (id: 126, cname: "马歇尔岛", countryId: 692), - (id: 125, cname: "马提尼克岛", countryId: 596), - (id: 124, cname: "马其顿", countryId: 389), - (id: 123, cname: "马里亚纳岛", countryId: 1670), - (id: 122, cname: "马里", countryId: 223), - (id: 121, cname: "马拉维", countryId: 265), - (id: 120, cname: "马耳他", countryId: 356), - (id: 119, cname: "马尔代夫", countryId: 960), - (id: 129, cname: "蒙古", countryId: 976), - (id: 130, cname: "蒙特塞拉特岛", countryId: 1664), - (id: 140, cname: "纳米比亚", countryId: 264), - (id: 139, cname: "墨西哥", countryId: 52), - (id: 138, cname: "莫桑比克", countryId: 258), - (id: 137, cname: "摩纳哥", countryId: 377), - (id: 136, cname: "摩洛哥", countryId: 212), - (id: 135, cname: "摩尔多瓦", countryId: 373), - (id: 134, cname: "缅甸", countryId: 95), - (id: 133, cname: "密克罗尼西亚", countryId: 691), - (id: 132, cname: "秘鲁", countryId: 51), - (id: 131, cname: "孟加拉国", countryId: 880), - (id: 118, cname: "马达加斯加", countryId: 261), - (id: 167, cname: "圣卢西亚", countryId: 1784), - (id: 216, cname: "智利", countryId: 56), - (id: 203, cname: "牙买加", countryId: 1876), - (id: 202, cname: "叙利亚", countryId: 963), - (id: 201, cname: "匈牙利", countryId: 36), - (id: 200, cname: "科特迪瓦", countryId: 225), - (id: 199, cname: "希腊", countryId: 30), - (id: 198, cname: "西班牙", countryId: 34), - (id: 197, cname: "乌兹别克斯坦", countryId: 998), - (id: 196, cname: "乌拉圭", countryId: 598), - (id: 195, cname: "乌克兰", countryId: 380), - (id: 194, cname: "乌干达", countryId: 256), - (id: 204, cname: "亚美尼亚", countryId: 374), - (id: 205, cname: "也门", countryId: 967), - (id: 215, cname: "直布罗陀", countryId: 350), - (id: 214, cname: "乍得", countryId: 235), - (id: 213, cname: "赞比亚", countryId: 260), - (id: 212, cname: "越南", countryId: 84), - (id: 211, cname: "约旦", countryId: 962), - (id: 210, cname: "印尼", countryId: 62), - (id: 209, cname: "印度", countryId: 91), - (id: 208, cname: "以色列", countryId: 972), - (id: 207, cname: "伊朗", countryId: 98), - (id: 206, cname: "伊拉克", countryId: 964), - (id: 193, cname: "文莱", countryId: 673), - (id: 192, cname: "委内瑞拉", countryId: 58), - (id: 191, cname: "维珍群岛(英属)", countryId: 1284), - (id: 178, cname: "泰国", countryId: 66), - (id: 177, cname: "索马里", countryId: 252), - (id: 176, cname: "所罗门群岛", countryId: 677), - (id: 175, cname: "苏里南", countryId: 597), - (id: 174, cname: "苏丹", countryId: 249), - (id: 173, cname: "斯威士兰", countryId: 268), - (id: 172, cname: "斯洛文尼亚", countryId: 386), - (id: 171, cname: "斯洛伐克", countryId: 421), - (id: 170, cname: "斯里兰卡", countryId: 94), - (id: 169, cname: "圣皮埃尔和密克隆群岛", countryId: 508), - (id: 179, cname: "坦桑尼亚", countryId: 255), - (id: 180, cname: "汤加", countryId: 676), - (id: 190, cname: "维珍群岛(美属)", countryId: 1340), - (id: 189, cname: "瓦努阿图", countryId: 678), - (id: 188, cname: "托克劳岛", countryId: 690), - (id: 187, cname: "土库曼斯坦", countryId: 993), - (id: 186, cname: "土耳其", countryId: 90), - (id: 185, cname: "图瓦卢", countryId: 688), - (id: 184, cname: "突尼斯", countryId: 216), - (id: 183, cname: "阿森松岛", countryId: 247), - (id: 182, cname: "特立尼达和多巴哥", countryId: 1868), - (id: 181, cname: "特克斯和凯科斯", countryId: 1649), - (id: 168, cname: "圣马力诺", countryId: 378), - (id: 67, cname: "法属圭亚那", countryId: 594), - (id: 54, cname: "不丹", countryId: 975), - (id: 53, cname: "博茨瓦纳", countryId: 267), - (id: 52, cname: "伯利兹", countryId: 501), - (id: 51, cname: "玻利维亚", countryId: 591), - (id: 50, cname: "波兰", countryId: 48), - (id: 49, cname: "波黑", countryId: 387), - (id: 48, cname: "波多黎各", countryId: 1787), - (id: 47, cname: "冰岛", countryId: 354), - (id: 46, cname: "贝宁", countryId: 229), - (id: 45, cname: "保加利亚", countryId: 359), - (id: 55, cname: "布基纳法索", countryId: 226), - (id: 56, cname: "布隆迪", countryId: 257), - (id: 66, cname: "法属波利尼西亚", countryId: 689), - (id: 65, cname: "法罗岛", countryId: 298), - (id: 64, cname: "厄立特里亚", countryId: 291), - (id: 63, cname: "厄瓜多尔", countryId: 593), - (id: 62, cname: "多米尼加代表", countryId: 1809), - (id: 61, cname: "多米尼加", countryId: 1767), - (id: 60, cname: "多哥", countryId: 228), - (id: 59, cname: "迪戈加西亚岛", countryId: 246), - (id: 58, cname: "丹麦", countryId: 45), - (id: 57, cname: "赤道几内亚", countryId: 240), - (id: 44, cname: "百慕大群岛", countryId: 1441), - (id: 43, cname: "白俄罗斯", countryId: 375), - (id: 42, cname: "巴西", countryId: 55), - (id: 29, cname: "爱尔兰", countryId: 353), - (id: 28, cname: "埃塞俄比亚", countryId: 251), - (id: 27, cname: "埃及", countryId: 20), - (id: 26, cname: "阿塞拜疆", countryId: 994), - (id: 25, cname: "阿曼", countryId: 968), - (id: 24, cname: "阿联酋", countryId: 971), - (id: 23, cname: "阿根廷", countryId: 54), - (id: 22, cname: "阿富汗", countryId: 93), - (id: 21, cname: "阿尔及利亚", countryId: 213), - (id: 20, cname: "阿尔巴尼亚", countryId: 355), - (id: 30, cname: "爱沙尼亚", countryId: 372), - (id: 31, cname: "安道尔", countryId: 376), - (id: 41, cname: "巴拿马", countryId: 507), - (id: 40, cname: "巴林", countryId: 973), - (id: 39, cname: "巴拉圭", countryId: 595), - (id: 38, cname: "巴基斯坦", countryId: 92), - (id: 37, cname: "巴哈马群岛", countryId: 1242), - (id: 36, cname: "巴布亚新几内亚", countryId: 675), - (id: 35, cname: "巴巴多斯", countryId: 1246), - (id: 34, cname: "奥地利", countryId: 43), - (id: 33, cname: "安提瓜岛和巴布达", countryId: 1268), - (id: 32, cname: "安哥拉", countryId: 244), - (id: 68, cname: "非洲中部", countryId: 236), - (id: 117, cname: "罗马尼亚", countryId: 40), - (id: 104, cname: "科威特", countryId: 965), - (id: 103, cname: "科摩罗", countryId: 269), - (id: 102, cname: "开曼群岛", countryId: 1345), - (id: 101, cname: "卡塔尔", countryId: 974), - (id: 100, cname: "喀麦隆", countryId: 237), - (id: 99, cname: "聚会岛", countryId: 262), - (id: 98, cname: "津巴布韦", countryId: 263), - (id: 97, cname: "捷克", countryId: 420), - (id: 96, cname: "柬埔寨", countryId: 855), - (id: 95, cname: "加蓬", countryId: 241), - (id: 105, cname: "克罗地亚", countryId: 385), - (id: 106, cname: "肯尼亚", countryId: 254), - (id: 116, cname: "卢旺达", countryId: 250), - (id: 115, cname: "卢森堡", countryId: 352), - (id: 114, cname: "利比亚", countryId: 218), - (id: 113, cname: "利比里亚", countryId: 231), - (id: 112, cname: "立陶宛", countryId: 370), - (id: 111, cname: "黎巴嫩", countryId: 961), - (id: 110, cname: "老挝", countryId: 856), - (id: 109, cname: "莱索托", countryId: 266), - (id: 108, cname: "拉脱维亚", countryId: 371), - (id: 107, cname: "库克岛", countryId: 682), - (id: 94, cname: "加纳", countryId: 233), - (id: 93, cname: "几内亚比绍", countryId: 245), - (id: 92, cname: "几内亚", countryId: 224), - (id: 79, cname: "格林纳达", countryId: 1473), - (id: 78, cname: "哥斯达黎加", countryId: 506), - (id: 77, cname: "哥伦比亚", countryId: 57), - (id: 76, cname: "刚果(金)", countryId: 243), - (id: 75, cname: "刚果", countryId: 242), - (id: 74, cname: "冈比亚", countryId: 220), - (id: 73, cname: "福克兰岛", countryId: 500), - (id: 72, cname: "佛得角", countryId: 238), - (id: 71, cname: "芬兰", countryId: 358), - (id: 70, cname: "斐济", countryId: 679), - (id: 80, cname: "格陵兰岛", countryId: 299), - (id: 81, cname: "古巴", countryId: 53), - (id: 91, cname: "吉尔吉斯斯坦", countryId: 996), - (id: 90, cname: "吉布提", countryId: 253), - (id: 89, cname: "基里巴斯", countryId: 686), - (id: 88, cname: "维克岛", countryId: 1808), - (id: 87, cname: "洪都拉斯", countryId: 504), - (id: 86, cname: "荷兰", countryId: 31), - (id: 85, cname: "朝鲜", countryId: 850), - (id: 84, cname: "海地", countryId: 509), - (id: 83, cname: "关岛", countryId: 1671), - (id: 82, cname: "瓜德罗普岛", countryId: 590), - (id: 69, cname: "菲律宾", countryId: 63), - ]; } diff --git a/lib/common/dial_prefix.dart b/lib/common/dial_prefix.dart new file mode 100644 index 000000000..144fac9c1 --- /dev/null +++ b/lib/common/dial_prefix.dart @@ -0,0 +1,220 @@ +abstract final class Login { + //内容来自 https://passport.bilibili.com/web/generic/country/list + static const dialPrefix = [ + (id: 1, cname: "中国大陆", countryId: 86), + (id: 5, cname: "中国香港特别行政区", countryId: 852), + (id: 2, cname: "中国澳门特别行政区", countryId: 853), + (id: 3, cname: "中国台湾", countryId: 886), + (id: 4, cname: "美国", countryId: 1), + (id: 6, cname: "比利时", countryId: 32), + (id: 7, cname: "澳大利亚", countryId: 61), + (id: 8, cname: "法国", countryId: 33), + (id: 9, cname: "加拿大", countryId: 1), + (id: 10, cname: "日本", countryId: 81), + (id: 11, cname: "新加坡", countryId: 65), + (id: 12, cname: "韩国", countryId: 82), + (id: 13, cname: "马来西亚", countryId: 60), + (id: 14, cname: "英国", countryId: 44), + (id: 15, cname: "意大利", countryId: 39), + (id: 16, cname: "德国", countryId: 49), + (id: 18, cname: "俄罗斯", countryId: 7), + (id: 19, cname: "新西兰", countryId: 64), + (id: 153, cname: "瓦利斯群岛和富图纳群岛", countryId: 1681), + (id: 152, cname: "葡萄牙", countryId: 351), + (id: 151, cname: "帕劳", countryId: 680), + (id: 150, cname: "诺福克岛", countryId: 672), + (id: 149, cname: "挪威", countryId: 47), + (id: 148, cname: "纽埃岛", countryId: 683), + (id: 147, cname: "尼日利亚", countryId: 234), + (id: 146, cname: "尼日尔", countryId: 227), + (id: 145, cname: "尼加拉瓜", countryId: 505), + (id: 144, cname: "尼泊尔", countryId: 977), + (id: 143, cname: "瑙鲁", countryId: 674), + (id: 154, cname: "格鲁吉亚", countryId: 995), + (id: 155, cname: "瑞典", countryId: 46), + (id: 165, cname: "沙特阿拉伯", countryId: 966), + (id: 164, cname: "桑给巴尔岛", countryId: 259), + (id: 163, cname: "塞舌尔共和国", countryId: 248), + (id: 162, cname: "塞浦路斯", countryId: 357), + (id: 161, cname: "塞内加尔", countryId: 221), + (id: 160, cname: "塞拉利昂", countryId: 232), + (id: 159, cname: "萨摩亚,东部", countryId: 684), + (id: 158, cname: "萨摩亚,西部", countryId: 685), + (id: 157, cname: "萨尔瓦多", countryId: 503), + (id: 156, cname: "瑞士", countryId: 41), + (id: 166, cname: "圣多美和普林西比", countryId: 239), + (id: 142, cname: "塞尔维亚", countryId: 381), + (id: 141, cname: "南非", countryId: 27), + (id: 128, cname: "毛里塔尼亚", countryId: 222), + (id: 127, cname: "毛里求斯", countryId: 230), + (id: 126, cname: "马歇尔岛", countryId: 692), + (id: 125, cname: "马提尼克岛", countryId: 596), + (id: 124, cname: "马其顿", countryId: 389), + (id: 123, cname: "马里亚纳岛", countryId: 1670), + (id: 122, cname: "马里", countryId: 223), + (id: 121, cname: "马拉维", countryId: 265), + (id: 120, cname: "马耳他", countryId: 356), + (id: 119, cname: "马尔代夫", countryId: 960), + (id: 129, cname: "蒙古", countryId: 976), + (id: 130, cname: "蒙特塞拉特岛", countryId: 1664), + (id: 140, cname: "纳米比亚", countryId: 264), + (id: 139, cname: "墨西哥", countryId: 52), + (id: 138, cname: "莫桑比克", countryId: 258), + (id: 137, cname: "摩纳哥", countryId: 377), + (id: 136, cname: "摩洛哥", countryId: 212), + (id: 135, cname: "摩尔多瓦", countryId: 373), + (id: 134, cname: "缅甸", countryId: 95), + (id: 133, cname: "密克罗尼西亚", countryId: 691), + (id: 132, cname: "秘鲁", countryId: 51), + (id: 131, cname: "孟加拉国", countryId: 880), + (id: 118, cname: "马达加斯加", countryId: 261), + (id: 167, cname: "圣卢西亚", countryId: 1784), + (id: 216, cname: "智利", countryId: 56), + (id: 203, cname: "牙买加", countryId: 1876), + (id: 202, cname: "叙利亚", countryId: 963), + (id: 201, cname: "匈牙利", countryId: 36), + (id: 200, cname: "科特迪瓦", countryId: 225), + (id: 199, cname: "希腊", countryId: 30), + (id: 198, cname: "西班牙", countryId: 34), + (id: 197, cname: "乌兹别克斯坦", countryId: 998), + (id: 196, cname: "乌拉圭", countryId: 598), + (id: 195, cname: "乌克兰", countryId: 380), + (id: 194, cname: "乌干达", countryId: 256), + (id: 204, cname: "亚美尼亚", countryId: 374), + (id: 205, cname: "也门", countryId: 967), + (id: 215, cname: "直布罗陀", countryId: 350), + (id: 214, cname: "乍得", countryId: 235), + (id: 213, cname: "赞比亚", countryId: 260), + (id: 212, cname: "越南", countryId: 84), + (id: 211, cname: "约旦", countryId: 962), + (id: 210, cname: "印尼", countryId: 62), + (id: 209, cname: "印度", countryId: 91), + (id: 208, cname: "以色列", countryId: 972), + (id: 207, cname: "伊朗", countryId: 98), + (id: 206, cname: "伊拉克", countryId: 964), + (id: 193, cname: "文莱", countryId: 673), + (id: 192, cname: "委内瑞拉", countryId: 58), + (id: 191, cname: "维珍群岛(英属)", countryId: 1284), + (id: 178, cname: "泰国", countryId: 66), + (id: 177, cname: "索马里", countryId: 252), + (id: 176, cname: "所罗门群岛", countryId: 677), + (id: 175, cname: "苏里南", countryId: 597), + (id: 174, cname: "苏丹", countryId: 249), + (id: 173, cname: "斯威士兰", countryId: 268), + (id: 172, cname: "斯洛文尼亚", countryId: 386), + (id: 171, cname: "斯洛伐克", countryId: 421), + (id: 170, cname: "斯里兰卡", countryId: 94), + (id: 169, cname: "圣皮埃尔和密克隆群岛", countryId: 508), + (id: 179, cname: "坦桑尼亚", countryId: 255), + (id: 180, cname: "汤加", countryId: 676), + (id: 190, cname: "维珍群岛(美属)", countryId: 1340), + (id: 189, cname: "瓦努阿图", countryId: 678), + (id: 188, cname: "托克劳岛", countryId: 690), + (id: 187, cname: "土库曼斯坦", countryId: 993), + (id: 186, cname: "土耳其", countryId: 90), + (id: 185, cname: "图瓦卢", countryId: 688), + (id: 184, cname: "突尼斯", countryId: 216), + (id: 183, cname: "阿森松岛", countryId: 247), + (id: 182, cname: "特立尼达和多巴哥", countryId: 1868), + (id: 181, cname: "特克斯和凯科斯", countryId: 1649), + (id: 168, cname: "圣马力诺", countryId: 378), + (id: 67, cname: "法属圭亚那", countryId: 594), + (id: 54, cname: "不丹", countryId: 975), + (id: 53, cname: "博茨瓦纳", countryId: 267), + (id: 52, cname: "伯利兹", countryId: 501), + (id: 51, cname: "玻利维亚", countryId: 591), + (id: 50, cname: "波兰", countryId: 48), + (id: 49, cname: "波黑", countryId: 387), + (id: 48, cname: "波多黎各", countryId: 1787), + (id: 47, cname: "冰岛", countryId: 354), + (id: 46, cname: "贝宁", countryId: 229), + (id: 45, cname: "保加利亚", countryId: 359), + (id: 55, cname: "布基纳法索", countryId: 226), + (id: 56, cname: "布隆迪", countryId: 257), + (id: 66, cname: "法属波利尼西亚", countryId: 689), + (id: 65, cname: "法罗岛", countryId: 298), + (id: 64, cname: "厄立特里亚", countryId: 291), + (id: 63, cname: "厄瓜多尔", countryId: 593), + (id: 62, cname: "多米尼加代表", countryId: 1809), + (id: 61, cname: "多米尼加", countryId: 1767), + (id: 60, cname: "多哥", countryId: 228), + (id: 59, cname: "迪戈加西亚岛", countryId: 246), + (id: 58, cname: "丹麦", countryId: 45), + (id: 57, cname: "赤道几内亚", countryId: 240), + (id: 44, cname: "百慕大群岛", countryId: 1441), + (id: 43, cname: "白俄罗斯", countryId: 375), + (id: 42, cname: "巴西", countryId: 55), + (id: 29, cname: "爱尔兰", countryId: 353), + (id: 28, cname: "埃塞俄比亚", countryId: 251), + (id: 27, cname: "埃及", countryId: 20), + (id: 26, cname: "阿塞拜疆", countryId: 994), + (id: 25, cname: "阿曼", countryId: 968), + (id: 24, cname: "阿联酋", countryId: 971), + (id: 23, cname: "阿根廷", countryId: 54), + (id: 22, cname: "阿富汗", countryId: 93), + (id: 21, cname: "阿尔及利亚", countryId: 213), + (id: 20, cname: "阿尔巴尼亚", countryId: 355), + (id: 30, cname: "爱沙尼亚", countryId: 372), + (id: 31, cname: "安道尔", countryId: 376), + (id: 41, cname: "巴拿马", countryId: 507), + (id: 40, cname: "巴林", countryId: 973), + (id: 39, cname: "巴拉圭", countryId: 595), + (id: 38, cname: "巴基斯坦", countryId: 92), + (id: 37, cname: "巴哈马群岛", countryId: 1242), + (id: 36, cname: "巴布亚新几内亚", countryId: 675), + (id: 35, cname: "巴巴多斯", countryId: 1246), + (id: 34, cname: "奥地利", countryId: 43), + (id: 33, cname: "安提瓜岛和巴布达", countryId: 1268), + (id: 32, cname: "安哥拉", countryId: 244), + (id: 68, cname: "非洲中部", countryId: 236), + (id: 117, cname: "罗马尼亚", countryId: 40), + (id: 104, cname: "科威特", countryId: 965), + (id: 103, cname: "科摩罗", countryId: 269), + (id: 102, cname: "开曼群岛", countryId: 1345), + (id: 101, cname: "卡塔尔", countryId: 974), + (id: 100, cname: "喀麦隆", countryId: 237), + (id: 99, cname: "聚会岛", countryId: 262), + (id: 98, cname: "津巴布韦", countryId: 263), + (id: 97, cname: "捷克", countryId: 420), + (id: 96, cname: "柬埔寨", countryId: 855), + (id: 95, cname: "加蓬", countryId: 241), + (id: 105, cname: "克罗地亚", countryId: 385), + (id: 106, cname: "肯尼亚", countryId: 254), + (id: 116, cname: "卢旺达", countryId: 250), + (id: 115, cname: "卢森堡", countryId: 352), + (id: 114, cname: "利比亚", countryId: 218), + (id: 113, cname: "利比里亚", countryId: 231), + (id: 112, cname: "立陶宛", countryId: 370), + (id: 111, cname: "黎巴嫩", countryId: 961), + (id: 110, cname: "老挝", countryId: 856), + (id: 109, cname: "莱索托", countryId: 266), + (id: 108, cname: "拉脱维亚", countryId: 371), + (id: 107, cname: "库克岛", countryId: 682), + (id: 94, cname: "加纳", countryId: 233), + (id: 93, cname: "几内亚比绍", countryId: 245), + (id: 92, cname: "几内亚", countryId: 224), + (id: 79, cname: "格林纳达", countryId: 1473), + (id: 78, cname: "哥斯达黎加", countryId: 506), + (id: 77, cname: "哥伦比亚", countryId: 57), + (id: 76, cname: "刚果(金)", countryId: 243), + (id: 75, cname: "刚果", countryId: 242), + (id: 74, cname: "冈比亚", countryId: 220), + (id: 73, cname: "福克兰岛", countryId: 500), + (id: 72, cname: "佛得角", countryId: 238), + (id: 71, cname: "芬兰", countryId: 358), + (id: 70, cname: "斐济", countryId: 679), + (id: 80, cname: "格陵兰岛", countryId: 299), + (id: 81, cname: "古巴", countryId: 53), + (id: 91, cname: "吉尔吉斯斯坦", countryId: 996), + (id: 90, cname: "吉布提", countryId: 253), + (id: 89, cname: "基里巴斯", countryId: 686), + (id: 88, cname: "维克岛", countryId: 1808), + (id: 87, cname: "洪都拉斯", countryId: 504), + (id: 86, cname: "荷兰", countryId: 31), + (id: 85, cname: "朝鲜", countryId: 850), + (id: 84, cname: "海地", countryId: 509), + (id: 83, cname: "关岛", countryId: 1671), + (id: 82, cname: "瓜德罗普岛", countryId: 590), + (id: 69, cname: "菲律宾", countryId: 63), + ]; +} diff --git a/lib/common/skeleton/fav_pgc_item.dart b/lib/common/skeleton/fav_pgc_item.dart index 86fa755ee..2704b3ee0 100644 --- a/lib/common/skeleton/fav_pgc_item.dart +++ b/lib/common/skeleton/fav_pgc_item.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/skeleton.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:flutter/material.dart' hide LayoutBuilder; @@ -12,7 +12,7 @@ class FavPgcItemSkeleton extends StatelessWidget { return Skeleton( child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( diff --git a/lib/common/skeleton/media_bangumi.dart b/lib/common/skeleton/media_bangumi.dart index eb26f30c2..eeeabcfda 100644 --- a/lib/common/skeleton/media_bangumi.dart +++ b/lib/common/skeleton/media_bangumi.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/skeleton.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:flutter/material.dart'; class MediaPgcSkeleton extends StatefulWidget { @@ -15,11 +15,9 @@ class _MediaPgcSkeletonState extends State { Color bgColor = Theme.of(context).colorScheme.onInverseSurface; return Skeleton( child: Padding( - padding: const EdgeInsets.fromLTRB( - StyleString.safeSpace, - 7, - StyleString.safeSpace, - 7, + padding: const .symmetric( + horizontal: Style.safeSpace, + vertical: 7, ), child: Row( children: [ diff --git a/lib/common/skeleton/video_card_h.dart b/lib/common/skeleton/video_card_h.dart index b25a6a9dd..e328a6cd1 100644 --- a/lib/common/skeleton/video_card_h.dart +++ b/lib/common/skeleton/video_card_h.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/skeleton.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:flutter/material.dart'; class VideoCardHSkeleton extends StatelessWidget { @@ -10,25 +10,25 @@ class VideoCardHSkeleton extends StatelessWidget { final color = Theme.of(context).colorScheme.onInverseSurface; return Skeleton( child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + padding: const .symmetric( + horizontal: Style.safeSpace, vertical: 5, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: DecoratedBox( decoration: BoxDecoration( color: color, - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, ), ), ), Expanded( child: Padding( - padding: const EdgeInsets.fromLTRB(10, 4, 6, 4), + padding: const .fromLTRB(10, 4, 6, 4), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/common/skeleton/video_card_v.dart b/lib/common/skeleton/video_card_v.dart index faa33a92b..7a36f4d6c 100644 --- a/lib/common/skeleton/video_card_v.dart +++ b/lib/common/skeleton/video_card_v.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/skeleton.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:flutter/material.dart'; class VideoCardVSkeleton extends StatelessWidget { @@ -13,11 +13,11 @@ class VideoCardVSkeleton extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: DecoratedBox( decoration: BoxDecoration( color: color, - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, ), ), ), diff --git a/lib/common/style.dart b/lib/common/style.dart new file mode 100644 index 000000000..a50f36f79 --- /dev/null +++ b/lib/common/style.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart' + show BorderRadius, Radius, BoxConstraints, ButtonStyle, VisualDensity; + +abstract final class Style { + static const cardSpace = 8.0; + static const safeSpace = 12.0; + static const mdRadius = BorderRadius.all(imgRadius); + static const imgRadius = Radius.circular(10); + static const aspectRatio = 16 / 10; + static const aspectRatio16x9 = 16 / 9; + static const imgMaxRatio = 2.6; + static const bottomSheetRadius = BorderRadius.vertical( + top: Radius.circular(18), + ); + static const dialogFixedConstraints = BoxConstraints( + minWidth: 420, + maxWidth: 420, + ); + static const topBarHeight = 52.0; + static const buttonStyle = ButtonStyle( + visualDensity: VisualDensity(horizontal: -2, vertical: -1.25), + tapTargetSize: .shrinkWrap, + ); +} diff --git a/lib/common/widgets/color_palette.dart b/lib/common/widgets/color_palette.dart index 3dda88cfb..ed6fe0a47 100644 --- a/lib/common/widgets/color_palette.dart +++ b/lib/common/widgets/color_palette.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:flutter/material.dart'; class ColorPalette extends StatelessWidget { @@ -62,7 +62,7 @@ class ColorPalette extends StatelessWidget { padding: const EdgeInsets.all(6), decoration: BoxDecoration( color: colorScheme.onInverseSurface, - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, ), child: child, ); diff --git a/lib/common/widgets/dialog/export_import.dart b/lib/common/widgets/dialog/export_import.dart index 6050c812c..fc7c9a090 100644 --- a/lib/common/widgets/dialog/export_import.dart +++ b/lib/common/widgets/dialog/export_import.dart @@ -2,7 +2,7 @@ import 'dart:async' show FutureOr; import 'dart:convert' show utf8, jsonDecode; import 'dart:io' show File; -import 'package:PiliPlus/common/constants.dart' show StyleString; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:file_picker/file_picker.dart'; @@ -155,7 +155,7 @@ void importFromInput( context: context, builder: (context) => AlertDialog( title: Text('输入$title'), - constraints: StyleString.dialogFixedConstraints, + constraints: Style.dialogFixedConstraints, content: TextFormField( key: key, minLines: 4, diff --git a/lib/common/widgets/image/image_save.dart b/lib/common/widgets/image/image_save.dart index acfa58c60..3a232d45b 100644 --- a/lib/common/widgets/image/image_save.dart +++ b/lib/common/widgets/image/image_save.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/http/user.dart'; @@ -22,10 +22,10 @@ void imageSaveDialog({ final theme = Theme.of(context); return Container( width: imgWidth, - margin: const .symmetric(horizontal: StyleString.safeSpace), + margin: const .symmetric(horizontal: Style.safeSpace), decoration: BoxDecoration( color: theme.colorScheme.surface, - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, ), child: Column( mainAxisSize: MainAxisSize.min, @@ -39,8 +39,8 @@ void imageSaveDialog({ src: cover, quality: 100, width: imgWidth, - height: imgWidth / StyleString.aspectRatio16x9, - borderRadius: const .vertical(top: StyleString.imgRadius), + height: imgWidth / Style.aspectRatio16x9, + borderRadius: const .vertical(top: Style.imgRadius), ), ), Positioned( diff --git a/lib/common/widgets/image/network_img_layer.dart b/lib/common/widgets/image/network_img_layer.dart index c6a7528c1..c6f327191 100644 --- a/lib/common/widgets/image/network_img_layer.dart +++ b/lib/common/widgets/image/network_img_layer.dart @@ -1,4 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/image_utils.dart'; @@ -16,7 +17,7 @@ class NetworkImgLayer extends StatelessWidget { this.fadeOutDuration = const Duration(milliseconds: 120), this.fadeInDuration = const Duration(milliseconds: 120), this.quality = 1, - this.borderRadius = StyleString.mdRadius, + this.borderRadius = Style.mdRadius, this.getPlaceHolder, this.fit = .cover, this.alignment = .center, @@ -108,7 +109,7 @@ class NetworkImgLayer extends StatelessWidget { ), child: Center( child: Image.asset( - isAvatar ? 'assets/images/noface.jpeg' : 'assets/images/loading.png', + isAvatar ? Assets.avatarPlaceHolder : Assets.loading, width: width, height: height, cacheWidth: width.cacheSize(context), diff --git a/lib/common/widgets/image_grid/image_grid_builder.dart b/lib/common/widgets/image_grid/image_grid_builder.dart index 0732fe07b..ddd65f9fe 100644 --- a/lib/common/widgets/image_grid/image_grid_builder.dart +++ b/lib/common/widgets/image_grid/image_grid_builder.dart @@ -18,7 +18,7 @@ import 'dart:collection' show HashSet; import 'dart:math' as math; -import 'package:PiliPlus/common/constants.dart' show StyleString; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart' show ImageModel; import 'package:flutter/foundation.dart' show kDebugMode; @@ -505,7 +505,7 @@ class ImageGridRenderObjectElement extends RenderObjectElement { if (width != 1) { imageWidth = math.min(imageWidth, width.toDouble()); } - imageHeight = imageWidth * math.min(ratioHW, StyleString.imgMaxRatio); + imageHeight = imageWidth * math.min(ratioHW, Style.imgMaxRatio); } } diff --git a/lib/common/widgets/image_grid/image_grid_view.dart b/lib/common/widgets/image_grid/image_grid_view.dart index 630ede337..b3a49f072 100644 --- a/lib/common/widgets/image_grid/image_grid_view.dart +++ b/lib/common/widgets/image_grid/image_grid_view.dart @@ -17,7 +17,8 @@ import 'dart:io' show Platform; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/image_grid/image_grid_builder.dart'; @@ -53,8 +54,7 @@ class ImageModel { bool? _isLongPic; bool? _isLivePhoto; - bool get isLongPic => - _isLongPic ??= (height / width) > StyleString.imgMaxRatio; + bool get isLongPic => _isLongPic ??= (height / width) > Style.imgMaxRatio; bool get isLivePhoto => _isLivePhoto ??= enableLivePhoto && liveUrl?.isNotEmpty == true; @@ -116,9 +116,9 @@ class ImageGridView extends StatelessWidget { int col, int length, int index, { - Radius r = StyleString.imgRadius, + Radius r = Style.imgRadius, }) { - if (length == 1) return StyleString.mdRadius; + if (length == 1) return Style.mdRadius; final bool hasUp = index - col >= 0; final bool hasDown = index + col < length; @@ -213,7 +213,7 @@ class ImageGridView extends StatelessWidget { ).colorScheme.onInverseSurface.withValues(alpha: 0.4), ), child: Image.asset( - 'assets/images/loading.png', + Assets.loading, width: width, height: height, cacheWidth: width.cacheSize(context), diff --git a/lib/common/widgets/image_viewer/image.dart b/lib/common/widgets/image_viewer/image.dart index 8dbba0d29..61a5e0fc2 100644 --- a/lib/common/widgets/image_viewer/image.dart +++ b/lib/common/widgets/image_viewer/image.dart @@ -5,7 +5,7 @@ import 'dart:io' show File; import 'dart:math' as math; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image_viewer/viewer.dart'; import 'package:flutter/foundation.dart'; @@ -603,7 +603,7 @@ class _ImageState extends State with WidgetsBindingObserver { final imgHeight = _imageInfo!.image.height.toDouble(); final imgRatio = imgHeight / imgWidth; isLongPic = - imgRatio > StyleString.imgMaxRatio && + imgRatio > Style.imgMaxRatio && imgHeight > widget.containerSize.height; if (isLongPic) { final compatWidth = math.min(650.0, widget.containerSize.width); diff --git a/lib/common/widgets/pendant_avatar.dart b/lib/common/widgets/pendant_avatar.dart index 3b336524e..437b5be8b 100644 --- a/lib/common/widgets/pendant_avatar.dart +++ b/lib/common/widgets/pendant_avatar.dart @@ -1,77 +1,87 @@ +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/avatar_badge_type.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; -import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:flutter/material.dart'; class PendantAvatar extends StatelessWidget { - final BadgeType _badgeType; - final String? avatar; - final double size; - final double badgeSize; - final String? garbPendantImage; - final int? roomId; - final VoidCallback? onTap; - final bool isMemberAvatar; - - const PendantAvatar({ + const PendantAvatar( + this.url, { super.key, - required this.avatar, - required this.size, - this.isMemberAvatar = false, + required double size, double? badgeSize, - bool isVip = false, + int? vipStatus, int? officialType, - this.garbPendantImage, + this.pendantImage, + this.pendentOffset = 6, this.roomId, this.onTap, - }) : _badgeType = officialType == null || officialType < 0 - ? isVip - ? BadgeType.vip - : BadgeType.none + }) : preferredSize = size, + badgeSize = badgeSize ?? size / 3, + badgeType = officialType == null || officialType < 0 + ? vipStatus != null && vipStatus > 0 + ? .vip + : .none : officialType == 0 - ? BadgeType.person + ? .person : officialType == 1 - ? BadgeType.institution - : BadgeType.none, - badgeSize = badgeSize ?? size / 3; + ? .institution + : .none; static bool showDynDecorate = Pref.showDynDecorate; + final BadgeType badgeType; + final String? url; + final double preferredSize; + final double badgeSize; + final String? pendantImage; + final double pendentOffset; + final int? roomId; + final VoidCallback? onTap; + @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; + final showPendant = showDynDecorate && pendantImage?.isNotEmpty == true; + final size = showPendant ? preferredSize - pendentOffset : preferredSize; Widget? pendant; - if (showDynDecorate && !garbPendantImage.isNullOrEmpty) { + if (showPendant) { final pendantSize = size * 1.75; pendant = Positioned( // -(size * 1.75 - size) / 2 - top: -0.375 * size + (isMemberAvatar ? 2 : 0), + top: -0.375 * size + pendentOffset, child: IgnorePointer( child: NetworkImgLayer( type: .emote, width: pendantSize, height: pendantSize, - src: garbPendantImage, + src: pendantImage, getPlaceHolder: () => const SizedBox.shrink(), ), ), ); } - return Stack( - alignment: Alignment.bottomCenter, - clipBehavior: Clip.none, + Widget avatar = NetworkImgLayer( + src: url, + width: size, + height: size, + type: ImageType.avatar, + ); + if (onTap != null) { + avatar = GestureDetector( + behavior: .opaque, + onTap: onTap, + child: avatar, + ); + } + Widget child = Stack( + clipBehavior: .none, + alignment: .center, children: [ - onTap == null - ? _buildAvatar(colorScheme, isMemberAvatar) - : GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: onTap, - child: _buildAvatar(colorScheme, isMemberAvatar), - ), + avatar, ?pendant, if (roomId != null) Positioned( @@ -106,63 +116,38 @@ class PendantAvatar extends StatelessWidget { ), ), ) - else if (_badgeType != BadgeType.none) - _buildBadge(context, colorScheme, isMemberAvatar), + else if (badgeType != BadgeType.none) + _buildBadge(context, colorScheme), ], ); + if (showPendant) { + return SizedBox.square( + dimension: preferredSize, + child: child, + ); + } + return child; } - Widget _buildAvatar(ColorScheme colorScheme, bool isMemberAvatar) => - isMemberAvatar - ? DecoratedBox( - decoration: BoxDecoration( - border: Border.all( - width: 2, - color: colorScheme.surface, - ), - shape: BoxShape.circle, - ), - child: Padding( - padding: const EdgeInsets.all(2), - child: NetworkImgLayer( - src: avatar, - width: size, - height: size, - type: ImageType.avatar, - ), - ), - ) - : NetworkImgLayer( - src: avatar, - width: size, - height: size, - type: ImageType.avatar, - ); - - Widget _buildBadge( - BuildContext context, - ColorScheme colorScheme, - bool isMemberAvatar, - ) { - final child = switch (_badgeType) { + Widget _buildBadge(BuildContext context, ColorScheme colorScheme) { + final child = switch (badgeType) { BadgeType.vip => Image.asset( - 'assets/images/big-vip.png', + Assets.vipIcon, width: badgeSize, height: badgeSize, cacheWidth: badgeSize.cacheSize(context), - semanticLabel: _badgeType.desc, + semanticLabel: badgeType.desc, ), _ => Icon( Icons.offline_bolt, - color: _badgeType.color, + color: badgeType.color, size: badgeSize, - semanticLabel: _badgeType.desc, + semanticLabel: badgeType.desc, ), }; - final offset = isMemberAvatar ? 2.0 : 0.0; return Positioned( - right: offset, - bottom: offset, + right: 0.0, + bottom: 0.0, child: IgnorePointer( child: DecoratedBox( decoration: BoxDecoration( diff --git a/lib/common/widgets/select_mask.dart b/lib/common/widgets/select_mask.dart index cf71ff032..5c964bc87 100644 --- a/lib/common/widgets/select_mask.dart +++ b/lib/common/widgets/select_mask.dart @@ -1,10 +1,10 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:flutter/material.dart'; Widget selectMask( ThemeData theme, bool checked, { - BorderRadiusGeometry borderRadius = StyleString.mdRadius, + BorderRadiusGeometry borderRadius = Style.mdRadius, }) { return AnimatedOpacity( opacity: checked ? 1 : 0, diff --git a/lib/common/widgets/video_card/video_card_h.dart b/lib/common/widgets/video_card/video_card_h.dart index e833019a7..940159cce 100644 --- a/lib/common/widgets/video_card/video_card_h.dart +++ b/lib/common/widgets/video_card/video_card_h.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -120,14 +120,14 @@ class VideoCardH extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { final double maxWidth = boxConstraints.maxWidth; diff --git a/lib/common/widgets/video_card/video_card_v.dart b/lib/common/widgets/video_card/video_card_v.dart index b1dd289f4..a20a5c5c3 100644 --- a/lib/common/widgets/video_card/video_card_v.dart +++ b/lib/common/widgets/video_card/video_card_v.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -87,7 +87,7 @@ class VideoCardV extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/http/video.dart b/lib/http/video.dart index 76ad7e8d4..5eae19f60 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -564,7 +564,6 @@ abstract final class VideoHttp { replyInfo.id.toString(), (replyInfo.deepCopy() ..unknownFields.clear() - ..clearMemberV2() ..clearTrackInfo()) .writeToBuffer(), ); diff --git a/lib/main.dart b/lib/main.dart index 89270843d..2cee03f74 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -16,8 +16,8 @@ import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/cache_manager.dart'; import 'package:PiliPlus/utils/calc_window_position.dart'; import 'package:PiliPlus/utils/date_utils.dart'; -import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; +import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/json_file_handler.dart'; import 'package:PiliPlus/utils/path_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; diff --git a/lib/models/dynamics/article_content_model.dart b/lib/models/dynamics/article_content_model.dart index ba9db4115..69a5f4ff3 100644 --- a/lib/models/dynamics/article_content_model.dart +++ b/lib/models/dynamics/article_content_model.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart' as common_style; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/models/dynamics/vote_model.dart'; @@ -49,7 +49,7 @@ class Pic { style = json['style']; liveUrl = json['live_url']; if (width != null && height != null) { - isLongPic = (height! / width!) > StyleString.imgMaxRatio; + isLongPic = (height! / width!) > common_style.Style.imgMaxRatio; } } } diff --git a/lib/models_new/live/live_contribution_rank/item.dart b/lib/models_new/live/live_contribution_rank/item.dart index e4f43c707..4cc838f0c 100644 --- a/lib/models_new/live/live_contribution_rank/item.dart +++ b/lib/models_new/live/live_contribution_rank/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/models_new/live/live_contribution_rank/medal_info.dart'; +import 'package:PiliPlus/models_new/live/live_medal_wall/uinfo_medal.dart'; class LiveContributionRankItem { int? uid; @@ -6,7 +6,7 @@ class LiveContributionRankItem { String? face; int? rank; int? score; - MedalInfo? medalInfo; + UinfoMedal? uinfoMedal; LiveContributionRankItem({ this.uid, @@ -14,7 +14,7 @@ class LiveContributionRankItem { this.face, this.rank, this.score, - this.medalInfo, + this.uinfoMedal, }); factory LiveContributionRankItem.fromJson(Map json) => @@ -24,8 +24,8 @@ class LiveContributionRankItem { face: json['face'] as String?, rank: json['rank'] as int?, score: json['score'] as int?, - medalInfo: json['medal_info'] == null + uinfoMedal: json['uinfo']?['medal'] == null ? null - : MedalInfo.fromJson(json['medal_info'] as Map), + : UinfoMedal.fromJson(json['uinfo']?['medal']), ); } diff --git a/lib/models_new/live/live_contribution_rank/medal_info.dart b/lib/models_new/live/live_contribution_rank/medal_info.dart deleted file mode 100644 index 2c4c16716..000000000 --- a/lib/models_new/live/live_contribution_rank/medal_info.dart +++ /dev/null @@ -1,14 +0,0 @@ -class MedalInfo { - String? medalName; - int? level; - - MedalInfo({ - this.medalName, - this.level, - }); - - factory MedalInfo.fromJson(Map json) => MedalInfo( - medalName: json['medal_name'] as String?, - level: json['level'] as int?, - ); -} diff --git a/lib/models_new/live/live_danmaku/danmaku_msg.dart b/lib/models_new/live/live_danmaku/danmaku_msg.dart index 8c972c41c..c35939f65 100644 --- a/lib/models_new/live/live_danmaku/danmaku_msg.dart +++ b/lib/models_new/live/live_danmaku/danmaku_msg.dart @@ -1,5 +1,6 @@ import 'package:PiliPlus/models/model_owner.dart'; import 'package:PiliPlus/models_new/live/live_danmaku/live_emote.dart'; +import 'package:PiliPlus/models_new/live/live_medal_wall/uinfo_medal.dart'; import 'package:PiliPlus/pages/danmaku/danmaku_model.dart'; class DanmakuMsg { @@ -9,6 +10,7 @@ class DanmakuMsg { final BaseEmote? uemote; final Owner? reply; final LiveDanmaku extra; + final UinfoMedal? medalInfo; const DanmakuMsg({ required this.name, @@ -17,6 +19,7 @@ class DanmakuMsg { this.uemote, this.reply, required this.extra, + this.medalInfo, }); factory DanmakuMsg.fromPrefetch(Map obj) { @@ -36,6 +39,7 @@ class DanmakuMsg { ); } } + final medal = user['medal']; return DanmakuMsg( name: user['base']['name'], text: obj['text'], @@ -51,6 +55,7 @@ class DanmakuMsg { ts: checkInfo['ts'], ct: checkInfo['ct'], ), + medalInfo: medal == null ? null : UinfoMedal.fromJson(medal), ); } diff --git a/lib/models_new/live/live_medal_wall/uinfo_medal.dart b/lib/models_new/live/live_medal_wall/uinfo_medal.dart index 304cb489f..2814599f3 100644 --- a/lib/models_new/live/live_medal_wall/uinfo_medal.dart +++ b/lib/models_new/live/live_medal_wall/uinfo_medal.dart @@ -1,41 +1,26 @@ class UinfoMedal { String? name; int? level; - int? colorBorder; - int? color; int? id; int? ruid; String? v2MedalColorStart; - String? v2MedalColorEnd; - String? v2MedalColorBorder; String? v2MedalColorText; - String? v2MedalColorLevel; UinfoMedal({ this.name, this.level, - this.colorBorder, - this.color, this.id, this.ruid, this.v2MedalColorStart, - this.v2MedalColorEnd, - this.v2MedalColorBorder, this.v2MedalColorText, - this.v2MedalColorLevel, }); factory UinfoMedal.fromJson(Map json) => UinfoMedal( name: json['name'] as String?, level: json['level'] as int?, - colorBorder: json['color_border'] as int?, - color: json['color'] as int?, id: json['id'] as int?, ruid: json['ruid'] as int?, v2MedalColorStart: json['v2_medal_color_start'] as String?, - v2MedalColorEnd: json['v2_medal_color_end'] as String?, - v2MedalColorBorder: json['v2_medal_color_border'] as String?, v2MedalColorText: json['v2_medal_color_text'] as String?, - v2MedalColorLevel: json['v2_medal_color_level'] as String?, ); } diff --git a/lib/models_new/live/live_superchat/item.dart b/lib/models_new/live/live_superchat/item.dart index c45039be7..f73b6d688 100644 --- a/lib/models_new/live/live_superchat/item.dart +++ b/lib/models_new/live/live_superchat/item.dart @@ -1,10 +1,13 @@ +import 'package:PiliPlus/models_new/live/live_medal_wall/uinfo_medal.dart'; import 'package:PiliPlus/models_new/live/live_superchat/user_info.dart'; +import 'package:PiliPlus/utils/parse_string.dart'; import 'package:PiliPlus/utils/utils.dart'; class SuperChatItem { int id; int uid; int price; + String? backgroundImage; String backgroundColor; String backgroundBottomColor; String backgroundPriceColor; @@ -16,11 +19,13 @@ class SuperChatItem { UserInfo userInfo; late bool expired = false; late bool deleted = false; + UinfoMedal? medalInfo; SuperChatItem({ required this.id, required this.uid, required this.price, + this.backgroundImage, required this.backgroundColor, required this.backgroundBottomColor, required this.backgroundPriceColor, @@ -30,6 +35,7 @@ class SuperChatItem { required this.token, required this.ts, required this.userInfo, + this.medalInfo, }); static SuperChatItem get random => SuperChatItem.fromJson({ @@ -50,6 +56,7 @@ class SuperChatItem { id: Utils.safeToInt(json['id']) ?? Utils.random.nextInt(2147483647), uid: Utils.safeToInt(json['uid'])!, price: json['price'], + backgroundImage: noneNullOrEmptyString(json['background_image']), backgroundColor: json['background_color'] ?? '#EDF5FF', backgroundBottomColor: json['background_bottom_color'] ?? '#2A60B2', backgroundPriceColor: json['background_price_color'] ?? '#7497CD', @@ -59,6 +66,9 @@ class SuperChatItem { token: json['token'], ts: Utils.safeToInt(json['ts'])!, userInfo: UserInfo.fromJson(json['user_info'] as Map), + medalInfo: json['uinfo']?['medal'] == null + ? null + : UinfoMedal.fromJson(json['uinfo']['medal']), ); SuperChatItem copyWith({ @@ -75,6 +85,7 @@ class SuperChatItem { int? ts, UserInfo? userInfo, bool? expired, + UinfoMedal? medalInfo, }) { return SuperChatItem( id: id ?? this.id, @@ -90,6 +101,7 @@ class SuperChatItem { token: token ?? this.token, ts: ts ?? this.ts, userInfo: userInfo ?? this.userInfo, + medalInfo: medalInfo ?? this.medalInfo, ); } @@ -97,6 +109,7 @@ class SuperChatItem { 'id': id, 'uid': uid, 'price': price, + 'background_image': backgroundImage, 'background_color': backgroundColor, 'background_bottom_color': backgroundBottomColor, 'background_price_color': backgroundPriceColor, diff --git a/lib/models_new/space/space/live_fans_wearing.dart b/lib/models_new/space/space/live_fans_wearing.dart index b2d0ded58..5cbbf1573 100644 --- a/lib/models_new/space/space/live_fans_wearing.dart +++ b/lib/models_new/space/space/live_fans_wearing.dart @@ -17,34 +17,28 @@ class LiveFansWearing { class DetailV2 { int? uid; int? level; - String? medalColorLevel; String? medalColorName; String? medalName; int? medalId; String? medalColor; - String? medalColorBorder; DetailV2({ this.uid, this.level, - this.medalColorLevel, this.medalColorName, this.medalName, this.medalId, this.medalColor, - this.medalColorBorder, }); factory DetailV2.fromJson(Map json) { return DetailV2( uid: json["uid"], level: json["level"], - medalColorLevel: json["medal_color_level"], medalColorName: json["medal_color_name"], medalName: json["medal_name"], medalId: json["medal_id"], medalColor: json["medal_color"], - medalColorBorder: json["medal_color_border"], ); } } diff --git a/lib/pages/about/view.dart b/lib/pages/about/view.dart index 57b237ea8..7a7554f66 100644 --- a/lib/pages/about/view.dart +++ b/lib/pages/about/view.dart @@ -2,7 +2,9 @@ import 'dart:async'; import 'dart:io'; import 'package:PiliPlus/build_config.dart'; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/dialog/export_import.dart'; import 'package:PiliPlus/common/widgets/flutter/list_tile.dart'; @@ -64,7 +66,7 @@ class _AboutPageState extends State { void _showDialog() => showDialog( context: context, builder: (context) => AlertDialog( - constraints: StyleString.dialogFixedConstraints, + constraints: Style.dialogFixedConstraints, content: TextField( autofocus: true, onSubmitted: (value) { @@ -108,7 +110,7 @@ class _AboutPageState extends State { height: 150, excludeFromSemantics: true, cacheWidth: 150.cacheSize(context), - 'assets/images/logo/logo.png', + Assets.logo, ), ), ListTile( diff --git a/lib/pages/article/widgets/article_ops.dart b/lib/pages/article/widgets/article_ops.dart index 5237e318a..368a42473 100644 --- a/lib/pages/article/widgets/article_ops.dart +++ b/lib/pages/article/widgets/article_ops.dart @@ -1,6 +1,6 @@ import 'dart:math' as math; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/models_new/article/article_view/ops.dart'; import 'package:PiliPlus/pages/dynamics/widgets/vote.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; @@ -68,7 +68,7 @@ class ArticleOpus extends StatelessWidget { } }, child: ClipRRect( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, child: CachedNetworkImage( width: width, height: height, diff --git a/lib/pages/article/widgets/html_render.dart b/lib/pages/article/widgets/html_render.dart index b3eb183ea..caf10a468 100644 --- a/lib/pages/article/widgets/html_render.dart +++ b/lib/pages/article/widgets/html_render.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/widgets/image_viewer/hero.dart'; import 'package:PiliPlus/models/common/image_preview_type.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; @@ -64,8 +65,7 @@ Widget htmlRender({ imageUrl: ImageUtils.thumbnailUrl(imgUrl, 60), fadeInDuration: const Duration(milliseconds: 120), fadeOutDuration: const Duration(milliseconds: 120), - placeholder: (context, url) => - Image.asset('assets/images/loading.png'), + placeholder: (context, url) => Image.asset(Assets.loading), ), ), ); diff --git a/lib/pages/article/widgets/opus_content.dart b/lib/pages/article/widgets/opus_content.dart index 2771f5a19..18682bb3f 100644 --- a/lib/pages/article/widgets/opus_content.dart +++ b/lib/pages/article/widgets/opus_content.dart @@ -1,5 +1,6 @@ import 'dart:math' as math; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image/cached_network_svg_image.dart'; @@ -231,8 +232,7 @@ class OpusContent extends StatelessWidget { imageUrl: ImageUtils.thumbnailUrl(pic.url!, 60), fadeInDuration: const Duration(milliseconds: 120), fadeOutDuration: const Duration(milliseconds: 120), - placeholder: (_, _) => - Image.asset('assets/images/loading.png'), + placeholder: (_, _) => Image.asset(Assets.loading), ); if (!(pic.isLongPic ?? false)) { child = fromHero( @@ -715,18 +715,21 @@ Widget moduleBlockedItem( ) { late final isDarkMode = theme.brightness.isDark; - BoxDecoration? bgImg() { + BoxDecoration? bgImg(double width) { return moduleBlocked.bgImg == null ? null : BoxDecoration( image: DecorationImage( fit: BoxFit.fill, - image: CachedNetworkImageProvider( - ImageUtils.thumbnailUrl( - isDarkMode - ? moduleBlocked.bgImg!.imgDark - : moduleBlocked.bgImg!.imgDay, + image: ResizeImage( + CachedNetworkImageProvider( + ImageUtils.thumbnailUrl( + isDarkMode + ? moduleBlocked.bgImg!.imgDark + : moduleBlocked.bgImg!.imgDay, + ), ), + width: width.cacheSize(context), ), ), ); @@ -793,7 +796,7 @@ Widget moduleBlockedItem( return Container( width: maxWidth, height: maxWidth, - decoration: bgImg(), + decoration: bgImg(maxWidth), padding: const EdgeInsets.all(12), child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -822,43 +825,50 @@ Widget moduleBlockedItem( ), ); } - return Container( - decoration: bgImg(), - padding: const EdgeInsets.all(12), - child: Row( - spacing: 8, - children: [ - if (moduleBlocked.icon != null) icon(42), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - spacing: 2, - children: [ - if (moduleBlocked.title?.isNotEmpty == true) - Text(moduleBlocked.title!), - if (moduleBlocked.hintMessage?.isNotEmpty == true) - Text( - moduleBlocked.hintMessage!, - style: TextStyle( - fontSize: 13, - color: theme.colorScheme.outline, - ), - ), - ], - ), - ), - if (moduleBlocked.button != null) - btn( - context, - visualDensity: const VisualDensity(vertical: -3, horizontal: -4), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6)), + return LayoutBuilder( + builder: (context, constraints) { + return Container( + decoration: bgImg(constraints.maxWidth), + padding: const EdgeInsets.all(12), + child: Row( + spacing: 8, + children: [ + if (moduleBlocked.icon != null) icon(42), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + spacing: 2, + children: [ + if (moduleBlocked.title?.isNotEmpty == true) + Text(moduleBlocked.title!), + if (moduleBlocked.hintMessage?.isNotEmpty == true) + Text( + moduleBlocked.hintMessage!, + style: TextStyle( + fontSize: 13, + color: theme.colorScheme.outline, + ), + ), + ], + ), ), - padding: const EdgeInsets.symmetric(horizontal: 10), - ), - ], - ), + if (moduleBlocked.button != null) + btn( + context, + visualDensity: const VisualDensity( + vertical: -3, + horizontal: -4, + ), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6)), + ), + padding: const EdgeInsets.symmetric(horizontal: 10), + ), + ], + ), + ); + }, ); } diff --git a/lib/pages/article_list/widgets/item.dart b/lib/pages/article_list/widgets/item.dart index a7e45fa0b..c6222f10a 100644 --- a/lib/pages/article_list/widgets/item.dart +++ b/lib/pages/article_list/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart'; @@ -33,7 +33,7 @@ class ArticleListItem extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( @@ -42,7 +42,7 @@ class ArticleListItem extends StatelessWidget { children: [ if (item.imageUrls?.isNotEmpty == true) AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { return NetworkImgLayer( diff --git a/lib/pages/audio/view.dart b/lib/pages/audio/view.dart index b76887bb0..de5ffc288 100644 --- a/lib/pages/audio/view.dart +++ b/lib/pages/audio/view.dart @@ -1,6 +1,7 @@ import 'dart:math' show min; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart'; @@ -292,7 +293,7 @@ class _AudioPageState extends State { WidgetSpan( alignment: .bottom, child: Image.asset( - 'assets/images/live.gif', + Assets.livingChart, width: 16, height: 16, cacheWidth: 16.cacheSize( @@ -336,7 +337,7 @@ class _AudioPageState extends State { WidgetSpan( alignment: .bottom, child: Image.asset( - 'assets/images/live.gif', + Assets.livingChart, width: 16, height: 16, cacheWidth: 16.cacheSize( @@ -391,7 +392,7 @@ class _AudioPageState extends State { children: [ InkWell( onTap: Get.back, - borderRadius: StyleString.bottomSheetRadius, + borderRadius: Style.bottomSheetRadius, child: SizedBox( height: 35, child: Center( @@ -460,7 +461,7 @@ class _AudioPageState extends State { children: [ InkWell( onTap: Get.back, - borderRadius: StyleString.bottomSheetRadius, + borderRadius: Style.bottomSheetRadius, child: SizedBox( height: 35, child: Center( @@ -595,7 +596,7 @@ class _AudioPageState extends State { children: [ InkWell( onTap: Get.back, - borderRadius: StyleString.bottomSheetRadius, + borderRadius: Style.bottomSheetRadius, child: SizedBox( height: 35, child: Center( diff --git a/lib/pages/common/common_page.dart b/lib/pages/common/common_page.dart index c5f3ba4f0..f94ee6153 100644 --- a/lib/pages/common/common_page.dart +++ b/lib/pages/common/common_page.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart' show StyleString; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/pages/home/controller.dart'; import 'package:PiliPlus/pages/main/controller.dart'; import 'package:flutter/foundation.dart' show clampDouble; @@ -58,7 +58,7 @@ abstract class CommonPageState extends State { _barOffset!.value = clampDouble( _barOffset!.value + scrollDelta, 0.0, - StyleString.topBarHeight, + Style.topBarHeight, ); } @@ -78,7 +78,7 @@ abstract class CommonPageState extends State { final newValue = clampDouble( value + scrollDelta, 0.0, - StyleString.topBarHeight, + Style.topBarHeight, ); final offset = value - newValue; if (offset != 0) { diff --git a/lib/pages/common/dyn/common_dyn_page.dart b/lib/pages/common/dyn/common_dyn_page.dart index cc0a32897..c063faca9 100644 --- a/lib/pages/common/dyn/common_dyn_page.dart +++ b/lib/pages/common/dyn/common_dyn_page.dart @@ -1,7 +1,7 @@ import 'dart:math' show pi; -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_reply.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart'; import 'package:PiliPlus/common/widgets/view_safe_area.dart'; @@ -89,7 +89,7 @@ abstract class CommonDynPageState extends State }, ), TextButton.icon( - style: StyleString.buttonStyle, + style: Style.buttonStyle, onPressed: controller.queryBySort, icon: Icon(Icons.sort, size: 16, color: secondary), label: Obx( diff --git a/lib/pages/download/detail/widgets/item.dart b/lib/pages/download/detail/widgets/item.dart index 583095e16..bfd2325ed 100644 --- a/lib/pages/download/detail/widgets/item.dart +++ b/lib/pages/download/detail/widgets/item.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; @@ -158,7 +158,7 @@ class DetailItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( @@ -168,7 +168,7 @@ class DetailItem extends StatelessWidget { clipBehavior: Clip.none, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, constraints) { final cover = File( @@ -184,7 +184,7 @@ class DetailItem extends StatelessWidget { } return cover.existsSync() ? ClipRRect( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, child: Image.file( cover, width: maxWidth, @@ -443,7 +443,7 @@ class DetailItem extends StatelessWidget { // ignore: deprecated_member_use year2023: true, minHeight: 2.5, - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, color: color, backgroundColor: highlightColor, value: progress, diff --git a/lib/pages/download/view.dart b/lib/pages/download/view.dart index dfa2ad31e..f002be2e5 100644 --- a/lib/pages/download/view.dart +++ b/lib/pages/download/view.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/appbar/appbar.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; @@ -313,7 +313,7 @@ class _DownloadPageState extends State { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( @@ -323,7 +323,7 @@ class _DownloadPageState extends State { clipBehavior: Clip.none, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, constraints) => NetworkImgLayer( src: pageInfo.cover, diff --git a/lib/pages/dynamics/widgets/additional_panel.dart b/lib/pages/dynamics/widgets/additional_panel.dart index 1de7dfc41..711129483 100644 --- a/lib/pages/dynamics/widgets/additional_panel.dart +++ b/lib/pages/dynamics/widgets/additional_panel.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/http/dynamics.dart'; @@ -21,7 +21,7 @@ Widget? addWidget( late final Color bgColor = floor == 1 ? theme.dividerColor.withValues(alpha: 0.08) : theme.colorScheme.surface; - late final borderRadius = floor == 1 ? null : StyleString.mdRadius; + late final borderRadius = floor == 1 ? null : Style.mdRadius; Widget? child; try { switch (type) { diff --git a/lib/pages/dynamics/widgets/author_panel.dart b/lib/pages/dynamics/widgets/author_panel.dart index 0f21528b5..e30732f42 100644 --- a/lib/pages/dynamics/widgets/author_panel.dart +++ b/lib/pages/dynamics/widgets/author_panel.dart @@ -1,6 +1,7 @@ import 'dart:math'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/dialog/report.dart'; import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; import 'package:PiliPlus/http/constants.dart'; @@ -52,21 +53,6 @@ class AuthorPanel extends StatelessWidget { this.onSetReplySubject, }); - Widget _buildAvatar(ModuleAuthorModel moduleAuthor) { - final pendant = moduleAuthor.pendant?.image; - final hasPendant = pendant != null && pendant.isNotEmpty; - Widget avatar = PendantAvatar( - avatar: moduleAuthor.face, - size: hasPendant ? 34 : 40, - officialType: null, // 已被注释 - garbPendantImage: pendant, - ); - if (hasPendant) { - avatar = Padding(padding: const EdgeInsets.all(3), child: avatar); - } - return avatar; - } - @override Widget build(BuildContext context) { final theme = Theme.of(context); @@ -105,147 +91,145 @@ class AuthorPanel extends StatelessWidget { ); } } - final moduleTagText = !isDetail ? item.modules.moduleTag?.text : null; - return Stack( - clipBehavior: Clip.none, - alignment: Alignment.center, - children: [ - Align( - alignment: Alignment.centerLeft, - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: moduleAuthor.type == 'AUTHOR_TYPE_NORMAL' - ? () { - feedBack(); - Get.toNamed('/member?mid=${moduleAuthor.mid}'); - } - : null, - child: Row( - spacing: 10, - mainAxisSize: MainAxisSize.min, + Widget header = GestureDetector( + onTap: moduleAuthor.type == 'AUTHOR_TYPE_NORMAL' + ? () { + feedBack(); + Get.toNamed('/member?mid=${moduleAuthor.mid}'); + } + : null, + child: Row( + spacing: 10, + children: [ + PendantAvatar( + size: 40, + moduleAuthor.face, + pendantImage: moduleAuthor.pendant?.image, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - _buildAvatar(moduleAuthor), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - moduleAuthor.name ?? '', - style: TextStyle( - color: - moduleAuthor.vip != null && - moduleAuthor.vip!.status > 0 && - moduleAuthor.vip!.type == 2 - ? theme.colorScheme.vipColor - : theme.colorScheme.onSurface, - fontSize: theme.textTheme.titleSmall!.fontSize, - ), - ), - ?pubTs, - ], + Text( + moduleAuthor.name!, + maxLines: 1, + overflow: .ellipsis, + style: TextStyle( + color: + moduleAuthor.vip != null && + moduleAuthor.vip!.status > 0 && + moduleAuthor.vip!.type == 2 + ? theme.colorScheme.vipColor + : theme.colorScheme.onSurface, + fontSize: theme.textTheme.titleSmall!.fontSize, + ), ), + ?pubTs, ], ), ), - ), - Align( - alignment: Alignment.centerRight, - child: moduleTagText != null - ? Row( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - padding: const EdgeInsets.symmetric( - horizontal: 4, - vertical: 2, - ), - decoration: BoxDecoration( - borderRadius: const BorderRadius.all( - Radius.circular(4), - ), - border: Border.all( - width: 1.25, - color: theme.colorScheme.primary, - ), - ), - child: Text( - moduleTagText, - style: TextStyle( - height: 1, - fontSize: 12, - color: theme.colorScheme.primary, - ), - strutStyle: const StrutStyle( - height: 1, - leading: 0, - fontSize: 12, - ), - ), - ), - _moreWidget(context), - ], - ) - : moduleAuthor.decorate != null - ? Row( - mainAxisSize: MainAxisSize.min, - children: [ - Stack( - clipBehavior: Clip.none, - alignment: Alignment.centerRight, - children: [ - CachedNetworkImage( - height: 32, - memCacheHeight: 32.cacheSize(context), - imageUrl: ImageUtils.safeThumbnailUrl( - moduleAuthor.decorate!.cardUrl, - ), - placeholder: (_, _) => const SizedBox.shrink(), - ), - if (moduleAuthor.decorate!.fan?.numStr?.isNotEmpty == - true) - Padding( - padding: const EdgeInsets.only(right: 32), - child: Text( - '${moduleAuthor.decorate!.fan!.numStr}', - style: TextStyle( - height: 1, - fontSize: 11, - fontFamily: 'digital_id_num', - color: - moduleAuthor.decorate!.fan?.color - ?.startsWith('#') == - true - ? Utils.parseColor( - moduleAuthor.decorate!.fan!.color!, - ) - : null, - ), - ), - ), - ], - ), - _moreWidget(context), - ], - ) - : _moreWidget(context), - ), - ], + ], + ), ); - } - - Widget _moreWidget(BuildContext context) => isSave - ? const SizedBox.shrink() - : SizedBox( - width: 32, - height: 32, - child: IconButton( - tooltip: '更多', - style: const ButtonStyle( - padding: WidgetStatePropertyAll(EdgeInsets.zero), + Widget? moreBtn = isSave + ? null + : SizedBox( + width: 32, + height: 32, + child: IconButton( + tooltip: '更多', + style: const ButtonStyle( + padding: WidgetStatePropertyAll(EdgeInsets.zero), + ), + onPressed: () => morePanel(context), + icon: const Icon(Icons.more_vert_outlined, size: 18), + ), + ); + final moduleTagText = !isDetail ? item.modules.moduleTag?.text : null; + if (moduleTagText != null) { + header = Row( + children: [ + Expanded(child: header), + Container( + padding: const .symmetric(horizontal: 4, vertical: 2), + decoration: BoxDecoration( + borderRadius: const .all(.circular(4)), + border: .all(width: 1.25, color: theme.colorScheme.primary), + ), + child: Text( + moduleTagText, + style: TextStyle( + height: 1, + fontSize: 12, + color: theme.colorScheme.primary, + ), + strutStyle: const StrutStyle(height: 1, leading: 0, fontSize: 12), ), - onPressed: () => morePanel(context), - icon: const Icon(Icons.more_vert_outlined, size: 18), ), + ?moreBtn, + ], + ); + } else if (moduleAuthor.decorate != null) { + const height = 32.0; + header = Stack( + clipBehavior: .none, + children: [ + Positioned( + top: 0, + right: 0, + height: height, + child: CachedNetworkImage( + height: height, + memCacheHeight: height.cacheSize(context), + imageUrl: ImageUtils.safeThumbnailUrl( + moduleAuthor.decorate!.cardUrl, + ), + placeholder: (_, _) => const SizedBox.shrink(), + ), + ), + if (moduleAuthor.decorate!.fan?.numStr?.isNotEmpty == true) + Positioned( + top: 0, + right: height, + height: height, + child: Center( + child: Text( + moduleAuthor.decorate!.fan!.numStr!.toString(), + style: TextStyle( + height: 1, + fontSize: 11, + fontFamily: Assets.digitalNum, + color: Utils.parseColor( + moduleAuthor.decorate!.fan!.color!, + ), + ), + ), + ), + ), + Padding( + padding: const .only(right: 80), + child: header, + ), + ], + ); + if (moreBtn != null) { + header = Row( + children: [ + Expanded(child: header), + moreBtn, + ], ); + } + } else if (moreBtn != null) { + header = Row( + children: [ + Expanded(child: header), + moreBtn, + ], + ); + } + return header; + } void morePanel(BuildContext context) { String? bvid; @@ -283,7 +267,7 @@ class AuthorPanel extends StatelessWidget { children: [ InkWell( onTap: Get.back, - borderRadius: StyleString.bottomSheetRadius, + borderRadius: Style.bottomSheetRadius, child: SizedBox( height: 35, child: Center( diff --git a/lib/pages/dynamics/widgets/live_panel_sub.dart b/lib/pages/dynamics/widgets/live_panel_sub.dart index f5a3233a9..26f44f0b2 100644 --- a/lib/pages/dynamics/widgets/live_panel_sub.dart +++ b/lib/pages/dynamics/widgets/live_panel_sub.dart @@ -1,4 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -42,7 +43,7 @@ Widget livePanelSub( LayoutBuilder( builder: (context, constraints) => NetworkImgLayer( width: constraints.maxWidth, - height: constraints.maxWidth / StyleString.aspectRatio, + height: constraints.maxWidth / Style.aspectRatio, src: live.cover, quality: 40, ), @@ -61,7 +62,7 @@ Widget livePanelSub( child: Image.asset( height: 16, cacheHeight: 16.cacheSize(context), - 'assets/images/live/live.gif', + Assets.livingRect, filterQuality: FilterQuality.low, ), ) @@ -90,7 +91,7 @@ Widget livePanelSub( ], ), borderRadius: BorderRadius.vertical( - bottom: StyleString.imgRadius, + bottom: Style.imgRadius, ), ), child: Text( diff --git a/lib/pages/dynamics/widgets/live_rcmd_panel.dart b/lib/pages/dynamics/widgets/live_rcmd_panel.dart index 5b39e5c57..9c2fd0545 100644 --- a/lib/pages/dynamics/widgets/live_rcmd_panel.dart +++ b/lib/pages/dynamics/widgets/live_rcmd_panel.dart @@ -1,4 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -36,7 +37,7 @@ Widget liveRcmdPanel( LayoutBuilder( builder: (context, constraints) => NetworkImgLayer( width: constraints.maxWidth, - height: constraints.maxWidth / StyleString.aspectRatio, + height: constraints.maxWidth / Style.aspectRatio, src: liveRcmd.cover, quality: 40, ), @@ -55,7 +56,7 @@ Widget liveRcmdPanel( child: Image.asset( height: 16, cacheHeight: 16.cacheSize(context), - 'assets/images/live/live.gif', + Assets.livingRect, filterQuality: FilterQuality.low, ), ) @@ -85,7 +86,7 @@ Widget liveRcmdPanel( ], ), borderRadius: BorderRadius.vertical( - bottom: StyleString.imgRadius, + bottom: Style.imgRadius, ), ), child: Text( diff --git a/lib/pages/dynamics/widgets/module_panel.dart b/lib/pages/dynamics/widgets/module_panel.dart index 5ca4005f5..507be62f7 100644 --- a/lib/pages/dynamics/widgets/module_panel.dart +++ b/lib/pages/dynamics/widgets/module_panel.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/grpc/bilibili/app/listener/v1.pbenum.dart' @@ -114,9 +114,9 @@ Widget module( : theme.colorScheme.surface, shape: floor == 1 ? null - : const RoundedRectangleBorder(borderRadius: StyleString.mdRadius), + : const RoundedRectangleBorder(borderRadius: Style.mdRadius), child: InkWell( - borderRadius: floor == 1 ? null : StyleString.mdRadius, + borderRadius: floor == 1 ? null : Style.mdRadius, onTap: () { try { String url = common.jumpUrl!; @@ -179,7 +179,7 @@ Widget module( ); case 'DYNAMIC_TYPE_MUSIC': final music = major!.music!; - final borderRadius = floor == 1 ? null : StyleString.mdRadius; + final borderRadius = floor == 1 ? null : Style.mdRadius; final Color bgColor = floor == 1 ? theme.dividerColor.withValues(alpha: 0.08) : theme.colorScheme.surface; diff --git a/lib/pages/dynamics/widgets/up_panel.dart b/lib/pages/dynamics/widgets/up_panel.dart index 4e107d423..8a53c6ca6 100644 --- a/lib/pages/dynamics/widgets/up_panel.dart +++ b/lib/pages/dynamics/widgets/up_panel.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/dynamic/up_panel_position.dart'; import 'package:PiliPlus/models/common/image_type.dart'; @@ -162,7 +163,7 @@ class _UpPanelState extends State { width: 38, height: 38, cacheWidth: 38.cacheSize(context), - 'assets/images/logo/logo.png', + Assets.logo, ), ); } else { diff --git a/lib/pages/dynamics/widgets/video_panel.dart b/lib/pages/dynamics/widgets/video_panel.dart index 6311a5857..001e8998f 100644 --- a/lib/pages/dynamics/widgets/video_panel.dart +++ b/lib/pages/dynamics/widgets/video_panel.dart @@ -1,5 +1,6 @@ // 视频or合集 -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -53,7 +54,7 @@ Widget videoSeasonWidget( LayoutBuilder( builder: (context, constraints) => NetworkImgLayer( width: constraints.maxWidth, - height: constraints.maxWidth / StyleString.aspectRatio, + height: constraints.maxWidth / Style.aspectRatio, src: cover, quality: 40, ), @@ -88,7 +89,7 @@ Widget videoSeasonWidget( ], ), borderRadius: BorderRadius.vertical( - bottom: StyleString.imgRadius, + bottom: Style.imgRadius, ), ), child: DefaultTextStyle.merge( @@ -122,7 +123,7 @@ Widget videoSeasonWidget( ], const Spacer(), Image.asset( - 'assets/images/play.png', + Assets.play, width: 50, height: 50, cacheHeight: 50.cacheSize(context), diff --git a/lib/pages/dynamics_create/view.dart b/lib/pages/dynamics_create/view.dart index c208db156..c6f9aab14 100644 --- a/lib/pages/dynamics_create/view.dart +++ b/lib/pages/dynamics_create/view.dart @@ -1,6 +1,6 @@ import 'dart:math' show max; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/button/toolbar_icon_button.dart'; import 'package:PiliPlus/common/widgets/custom_icon.dart'; @@ -299,9 +299,9 @@ class _CreateDynPanelState extends CommonRichTextPubPageState { if (imageList.length != limit) SliverToBoxAdapter( child: Material( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, child: InkWell( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, onTap: () => onPickImage(() { if (imageList.isNotEmpty && !enablePublish.value) { enablePublish.value = true; @@ -311,7 +311,7 @@ class _CreateDynPanelState extends CommonRichTextPubPageState { width: 100, height: 100, decoration: BoxDecoration( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, color: theme.colorScheme.secondaryContainer, ), child: const Center(child: Icon(Icons.add, size: 35)), diff --git a/lib/pages/dynamics_topic/view.dart b/lib/pages/dynamics_topic/view.dart index 545e52901..544046c85 100644 --- a/lib/pages/dynamics_topic/view.dart +++ b/lib/pages/dynamics_topic/view.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/common/widgets/dynamic_sliver_app_bar/dynamic_sliver_app_bar.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; @@ -12,6 +13,7 @@ import 'package:PiliPlus/models_new/dynamic/dyn_topic_top/top_details.dart'; import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart'; import 'package:PiliPlus/pages/dynamics_create/view.dart'; import 'package:PiliPlus/pages/dynamics_topic/controller.dart'; +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/num_utils.dart'; @@ -157,9 +159,10 @@ class _DynTopicPageState extends State with DynMixin { flexibleSpace: Container( decoration: BoxDecoration( image: DecorationImage( - image: Image.asset( - 'assets/images/topic-header-bg.png', - ).image, + image: ResizeImage( + width: MediaQuery.widthOf(context).cacheSize(context), + const AssetImage(Assets.topicHeader), + ), filterQuality: FilterQuality.low, fit: BoxFit.cover, ), diff --git a/lib/pages/episode_panel/view.dart b/lib/pages/episode_panel/view.dart index f27bffbc9..ba742459f 100644 --- a/lib/pages/episode_panel/view.dart +++ b/lib/pages/episode_panel/view.dart @@ -1,6 +1,7 @@ import 'dart:math'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/flutter/page/tabs.dart'; @@ -460,7 +461,7 @@ class _EpisodePanelState extends State onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( @@ -505,7 +506,7 @@ class _EpisodePanelState extends State ) else if (isCurrentIndex) Image.asset( - 'assets/images/live.png', + Assets.livingStatic, color: primary, height: 12, cacheHeight: 12.cacheSize(context), diff --git a/lib/pages/fav/article/widget/item.dart b/lib/pages/fav/article/widget/item.dart index 934df096e..abf6ba187 100644 --- a/lib/pages/fav/article/widget/item.dart +++ b/lib/pages/fav/article/widget/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -36,7 +36,7 @@ class FavArticleItem extends StatelessWidget { ), child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( @@ -44,7 +44,7 @@ class FavArticleItem extends StatelessWidget { children: [ if (item.cover != null) ...[ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { return NetworkImgLayer( diff --git a/lib/pages/fav/note/widget/item.dart b/lib/pages/fav/note/widget/item.dart index 6135e61d7..61396624e 100644 --- a/lib/pages/fav/note/widget/item.dart +++ b/lib/pages/fav/note/widget/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/select_mask.dart'; @@ -49,7 +49,7 @@ class FavNoteItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( @@ -58,7 +58,7 @@ class FavNoteItem extends StatelessWidget { children: [ if (item.pic?.isNotEmpty == true) AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { return Stack( diff --git a/lib/pages/fav/pgc/widget/item.dart b/lib/pages/fav/pgc/widget/item.dart index db59d8af7..3e4bd3247 100644 --- a/lib/pages/fav/pgc/widget/item.dart +++ b/lib/pages/fav/pgc/widget/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; @@ -52,7 +52,7 @@ class FavPgcItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( diff --git a/lib/pages/fav/topic/view.dart b/lib/pages/fav/topic/view.dart index ce76d2dcc..5349b0595 100644 --- a/lib/pages/fav/topic/view.dart +++ b/lib/pages/fav/topic/view.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; @@ -39,9 +39,9 @@ class _FavTopicPageState extends State slivers: [ SliverPadding( padding: EdgeInsets.only( - left: StyleString.safeSpace, - right: StyleString.safeSpace, - top: StyleString.safeSpace, + left: Style.safeSpace, + right: Style.safeSpace, + top: Style.safeSpace, bottom: MediaQuery.viewPaddingOf(context).bottom + 100, ), sliver: Obx( diff --git a/lib/pages/fav/video/widgets/item.dart b/lib/pages/fav/video/widgets/item.dart index 76401d9b0..6174490ea 100644 --- a/lib/pages/fav/video/widgets/item.dart +++ b/lib/pages/fav/video/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -40,7 +40,7 @@ class FavVideoItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { return Hero( diff --git a/lib/pages/fav_detail/widget/fav_video_card.dart b/lib/pages/fav_detail/widget/fav_video_card.dart index 6a7048124..1cbe34444 100644 --- a/lib/pages/fav_detail/widget/fav_video_card.dart +++ b/lib/pages/fav_detail/widget/fav_video_card.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; @@ -91,14 +91,14 @@ class FavVideoCardH extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/follow/widgets/follow_item.dart b/lib/pages/follow/widgets/follow_item.dart index a83d05e0e..4aecd3574 100644 --- a/lib/pages/follow/widgets/follow_item.dart +++ b/lib/pages/follow/widgets/follow_item.dart @@ -51,7 +51,7 @@ class FollowItem extends StatelessWidget { PendantAvatar( size: 45, badgeSize: 14, - avatar: item.face, + item.face, officialType: item.officialVerify?.type, ), const SizedBox(width: 10), diff --git a/lib/pages/history/widgets/item.dart b/lib/pages/history/widgets/item.dart index 6f660ecf8..08c9cf149 100644 --- a/lib/pages/history/widgets/item.dart +++ b/lib/pages/history/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -104,14 +104,14 @@ class HistoryItem extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/home/view.dart b/lib/pages/home/view.dart index 164237789..bc2862e03 100644 --- a/lib/pages/home/view.dart +++ b/lib/pages/home/view.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/custom_height_widget.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; @@ -48,7 +48,7 @@ class _HomePageState extends CommonPageState isScrollable: true, dividerColor: Colors.transparent, dividerHeight: 0, - splashBorderRadius: StyleString.mdRadius, + splashBorderRadius: Style.mdRadius, tabAlignment: TabAlignment.center, onTap: (_) { feedBack(); @@ -105,7 +105,7 @@ class _HomePageState extends CommonPageState final offset = barOffset.value; return CustomHeightWidget( offset: Offset(0, -offset), - height: StyleString.topBarHeight - offset, + height: Style.topBarHeight - offset, child: Padding( padding: padding, child: child, @@ -123,7 +123,7 @@ class _HomePageState extends CommonPageState child: AnimatedContainer( curve: Curves.easeInOutCubicEmphasized, duration: const Duration(milliseconds: 500), - height: showSearchBar ? StyleString.topBarHeight : 0, + height: showSearchBar ? Style.topBarHeight : 0, padding: padding, child: child, ), @@ -132,7 +132,7 @@ class _HomePageState extends CommonPageState } } return Container( - height: StyleString.topBarHeight, + height: Style.topBarHeight, padding: padding, child: child, ); diff --git a/lib/pages/later/widgets/video_card_h_later.dart b/lib/pages/later/widgets/video_card_h_later.dart index 9647a22ca..f4cad6b69 100644 --- a/lib/pages/later/widgets/video_card_h_later.dart +++ b/lib/pages/later/widgets/video_card_h_later.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; @@ -78,14 +78,14 @@ class VideoCardHLater extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { final double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/live/view.dart b/lib/pages/live/view.dart index 4d00f4a93..3fe46b972 100644 --- a/lib/pages/live/view.dart +++ b/lib/pages/live/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_v.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/button/more_btn.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; @@ -51,8 +51,8 @@ class _LivePageState extends State final ThemeData theme = Theme.of(context); return Container( clipBehavior: Clip.hardEdge, - margin: const EdgeInsets.symmetric(horizontal: StyleString.safeSpace), - decoration: const BoxDecoration(borderRadius: StyleString.mdRadius), + margin: const EdgeInsets.symmetric(horizontal: Style.safeSpace), + decoration: const BoxDecoration(borderRadius: Style.mdRadius), child: refreshIndicator( onRefresh: controller.onRefresh, child: CustomScrollView( @@ -61,7 +61,7 @@ class _LivePageState extends State slivers: [ SliverPadding( padding: const EdgeInsets.only( - top: StyleString.cardSpace, + top: Style.cardSpace, bottom: 100, ), sliver: SliverMainAxisGroup( @@ -176,10 +176,10 @@ class _LivePageState extends State } late final gridDelegate = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Grid.smallCardWidth, - childAspectRatio: StyleString.aspectRatio, + childAspectRatio: Style.aspectRatio, mainAxisExtent: textScaler.scale(90), ); diff --git a/lib/pages/live/widgets/live_item_app.dart b/lib/pages/live/widgets/live_item_app.dart index 77be142a8..794b562ab 100644 --- a/lib/pages/live/widgets/live_item_app.dart +++ b/lib/pages/live/widgets/live_item_app.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -33,7 +33,7 @@ class LiveCardVApp extends StatelessWidget { child: Column( children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/live_area_detail/child/view.dart b/lib/pages/live_area_detail/child/view.dart index 532ff8ed9..04d84bda6 100644 --- a/lib/pages/live_area_detail/child/view.dart +++ b/lib/pages/live_area_detail/child/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_v.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart'; @@ -53,9 +53,9 @@ class _LiveAreaChildPageState extends State slivers: [ SliverPadding( padding: EdgeInsets.only( - left: StyleString.safeSpace, - right: StyleString.safeSpace, - top: StyleString.safeSpace, + left: Style.safeSpace, + right: Style.safeSpace, + top: Style.safeSpace, bottom: MediaQuery.viewPaddingOf(context).bottom + 100, ), sliver: Obx( @@ -68,10 +68,10 @@ class _LiveAreaChildPageState extends State } late final gridDelegate = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Grid.smallCardWidth, - childAspectRatio: StyleString.aspectRatio, + childAspectRatio: Style.aspectRatio, mainAxisExtent: MediaQuery.textScalerOf(context).scale(90), ); diff --git a/lib/pages/live_follow/view.dart b/lib/pages/live_follow/view.dart index 2864b2ad7..0ea623ebb 100644 --- a/lib/pages/live_follow/view.dart +++ b/lib/pages/live_follow/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_v.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -40,8 +40,8 @@ class _LiveFollowPageState extends State { slivers: [ SliverPadding( padding: EdgeInsets.only( - left: StyleString.safeSpace + padding.left, - right: StyleString.safeSpace + padding.right, + left: Style.safeSpace + padding.left, + right: Style.safeSpace + padding.right, bottom: padding.bottom + 100, ), sliver: Obx(() => _buildBody(_controller.loadingState.value)), @@ -53,10 +53,10 @@ class _LiveFollowPageState extends State { } late final gridDelegate = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Grid.smallCardWidth, - childAspectRatio: StyleString.aspectRatio, + childAspectRatio: Style.aspectRatio, mainAxisExtent: MediaQuery.textScalerOf(context).scale(90), ); diff --git a/lib/pages/live_follow/widgets/live_item_follow.dart b/lib/pages/live_follow/widgets/live_item_follow.dart index b0dd15859..6b20ab64f 100644 --- a/lib/pages/live_follow/widgets/live_item_follow.dart +++ b/lib/pages/live_follow/widgets/live_item_follow.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -31,7 +31,7 @@ class LiveCardVFollow extends StatelessWidget { child: Column( children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/live_room/contribution_rank/view.dart b/lib/pages/live_room/contribution_rank/view.dart index 339f61a83..cb7852f57 100644 --- a/lib/pages/live_room/contribution_rank/view.dart +++ b/lib/pages/live_room/contribution_rank/view.dart @@ -1,16 +1,17 @@ import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; +import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; -import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/live/live_contribution_rank_type.dart'; import 'package:PiliPlus/models_new/live/live_contribution_rank/item.dart'; -import 'package:PiliPlus/models_new/live/live_contribution_rank/medal_info.dart'; import 'package:PiliPlus/pages/live_room/contribution_rank/controller.dart'; +import 'package:PiliPlus/pages/member/widget/medal_widget.dart'; import 'package:PiliPlus/utils/extension/scroll_controller_ext.dart'; import 'package:PiliPlus/utils/utils.dart'; +import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -191,6 +192,23 @@ class _Item extends StatelessWidget { @override Widget build(BuildContext context) { late final colorScheme = ColorScheme.of(context); + Widget child = Text(item.name!); + if (item.uinfoMedal case final uinfoMedal?) { + try { + child = Column( + spacing: 4, + crossAxisAlignment: .start, + children: [ + child, + MedalWidget.fromMedalInfo(medal: uinfoMedal), + ], + ); + } catch (e, s) { + if (kDebugMode) { + Utils.reportError(e, s); + } + } + } return InkWell( onTap: () => Get.toNamed('/member?mid=${item.uid}'), child: Padding( @@ -214,34 +232,13 @@ class _Item extends StatelessWidget { ), ), ), - PendantAvatar( - avatar: item.face, - size: 42, - ), - Expanded( - child: Column( - spacing: 3, - crossAxisAlignment: .start, - children: [ - Text(item.name!), - Row( - children: [ - if (item.medalInfo case MedalInfo( - :final medalName, - :final level, - )) - Text( - '$medalName$level', - style: TextStyle( - fontSize: 12, - color: colorScheme.onSurfaceVariant, - ), - ), - ], - ), - ], - ), + NetworkImgLayer( + src: item.face, + width: 42, + height: 42, + type: .avatar, ), + Expanded(child: child), if (showScore) Text( item.score.toString(), diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 880148314..ac56493a2 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -12,6 +12,7 @@ import 'package:PiliPlus/models/model_owner.dart'; import 'package:PiliPlus/models_new/live/live_danmaku/danmaku_msg.dart'; import 'package:PiliPlus/models_new/live/live_danmaku/live_emote.dart'; import 'package:PiliPlus/models_new/live/live_dm_info/data.dart'; +import 'package:PiliPlus/models_new/live/live_medal_wall/uinfo_medal.dart'; import 'package:PiliPlus/models_new/live/live_room_info_h5/data.dart'; import 'package:PiliPlus/models_new/live/live_room_play_info/codec.dart'; import 'package:PiliPlus/models_new/live/live_superchat/item.dart'; @@ -37,6 +38,7 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/video_utils.dart'; import 'package:canvas_danmaku/canvas_danmaku.dart'; import 'package:easy_debounce/easy_throttle.dart'; +import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -335,6 +337,10 @@ class LiveRoomController extends GetxController { messages.addAll(response); scrollToBottom(); } + } else { + if (kDebugMode) { + Utils.reportError(res.toString()); + } } } @@ -480,6 +486,7 @@ class LiveRoomController extends GetxController { name: extra['reply_uname'], ); } + final medal = user['medal']; addDm( DanmakuMsg( name: name, @@ -490,6 +497,7 @@ class LiveRoomController extends GetxController { uemote: uemote, extra: liveExtra, reply: reply, + medalInfo: medal == null ? null : UinfoMedal.fromJson(medal), ), DanmakuContentItem( msg, @@ -513,27 +521,27 @@ class LiveRoomController extends GetxController { } addDm(item); break; - case 'SUPER_CHAT_MESSAGE_DELETE' when showSuperChat: - if (obj['roomid'] == roomId) { - final ids = obj['data']?['ids'] as List?; - if (ids != null && ids.isNotEmpty) { - if (superChatType == .valid) { - superChatMsg.removeWhere((e) => ids.contains(e.id)); - } else { - bool? refresh; - for (final id in ids) { - if (superChatMsg.firstWhereOrNull((e) => e.id == id) - case final item?) { - item.deleted = true; - refresh ??= true; - } - } - if (refresh ?? false) { - superChatMsg.refresh(); - } - } - } - } + // case 'SUPER_CHAT_MESSAGE_DELETE' when showSuperChat: + // if (obj['roomid'] == roomId) { + // final ids = obj['data']?['ids'] as List?; + // if (ids != null && ids.isNotEmpty) { + // if (superChatType == .valid) { + // superChatMsg.removeWhere((e) => ids.contains(e.id)); + // } else { + // bool? refresh; + // for (final id in ids) { + // if (superChatMsg.firstWhereOrNull((e) => e.id == id) + // case final item?) { + // item.deleted = true; + // refresh ??= true; + // } + // } + // if (refresh ?? false) { + // superChatMsg.refresh(); + // } + // } + // } + // } case 'WATCHED_CHANGE': watchedShow.value = obj['data']['text_large']; break; @@ -544,7 +552,11 @@ class LiveRoomController extends GetxController { title.value = obj['data']['title']; break; } - } catch (_) {} + } catch (e, s) { + if (kDebugMode) { + Utils.reportError(e, s); + } + } } final RxInt likeClickTime = 0.obs; diff --git a/lib/pages/live_room/superchat/superchat_card.dart b/lib/pages/live_room/superchat/superchat_card.dart index 6821112a4..7153a400d 100644 --- a/lib/pages/live_room/superchat/superchat_card.dart +++ b/lib/pages/live_room/superchat/superchat_card.dart @@ -4,9 +4,13 @@ import 'package:PiliPlus/common/widgets/flutter/selectable_text/selection_area.d import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models_new/live/live_superchat/item.dart'; +import 'package:PiliPlus/pages/member/widget/medal_widget.dart'; +import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart' hide SelectionArea; import 'package:get/get.dart'; @@ -135,6 +139,31 @@ class _SuperChatCardState extends State { final bottomColor = Utils.parseColor(item.backgroundBottomColor); final border = BorderSide(color: bottomColor); void showMenu(TapUpDetails e) => _showMenu(e.globalPosition, item); + + Widget name = Text( + item.userInfo.uname, + maxLines: 1, + overflow: .ellipsis, + style: TextStyle( + color: Utils.parseColor(item.userInfo.nameColor), + ), + ); + if (item.medalInfo case final medal?) { + try { + name = Row( + spacing: 5, + children: [ + Flexible(child: name), + MedalWidget.fromMedalInfo(medal: medal), + ], + ); + } catch (e, s) { + if (kDebugMode) { + Utils.reportError(e, s); + } + } + } + return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ @@ -146,6 +175,13 @@ class _SuperChatCardState extends State { borderRadius: const .vertical(top: .circular(8)), color: Utils.parseColor(item.backgroundColor), border: Border(top: border, left: border, right: border), + image: item.backgroundImage == null + ? null + : DecorationImage( + image: CachedNetworkImageProvider( + ImageUtils.safeThumbnailUrl(item.backgroundImage), + ), + ), ), padding: const EdgeInsets.all(8), child: Row( @@ -162,12 +198,7 @@ class _SuperChatCardState extends State { mainAxisSize: .min, crossAxisAlignment: .start, children: [ - Text( - item.userInfo.uname, - style: TextStyle( - color: Utils.parseColor(item.userInfo.nameColor), - ), - ), + name, Text( "¥${item.price}", style: TextStyle( diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index b68f1b250..aedbfacd4 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -2,7 +2,8 @@ import 'dart:io'; import 'dart:math'; import 'dart:ui'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/common/widgets/flutter/page/page_view.dart'; @@ -384,7 +385,7 @@ class _LiveRoomPageState extends State ); } else { child = Image.asset( - 'assets/images/live/default_bg.webp', + Assets.livingBackground, fit: BoxFit.cover, width: maxWidth, height: maxHeight, @@ -417,7 +418,7 @@ class _LiveRoomPageState extends State } Widget _buildPH(bool isFullScreen) { - final height = maxWidth / StyleString.aspectRatio16x9; + final height = maxWidth / Style.aspectRatio16x9; final videoHeight = isFullScreen ? maxHeight - padding.top : height; final bottomHeight = maxHeight - padding.top - height - kToolbarHeight; return Column( diff --git a/lib/pages/live_room/widgets/chat_panel.dart b/lib/pages/live_room/widgets/chat_panel.dart index a6d42d283..595a0716a 100644 --- a/lib/pages/live_room/widgets/chat_panel.dart +++ b/lib/pages/live_room/widgets/chat_panel.dart @@ -7,6 +7,7 @@ import 'package:PiliPlus/models_new/live/live_danmaku/danmaku_msg.dart'; import 'package:PiliPlus/models_new/live/live_superchat/item.dart'; import 'package:PiliPlus/pages/live_room/controller.dart'; import 'package:PiliPlus/pages/live_room/superchat/superchat_card.dart'; +import 'package:PiliPlus/pages/member/widget/medal_widget.dart'; import 'package:PiliPlus/pages/video/widgets/header_control.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -57,6 +58,21 @@ class LiveRoomChatPanel extends StatelessWidget { itemBuilder: (_, index) { final item = liveRoomController.messages[index]; if (item is DanmakuMsg) { + WidgetSpan? medal; + if (item.medalInfo case final medalInfo?) { + try { + medal = WidgetSpan( + child: Padding( + padding: const .symmetric(horizontal: 3), + child: MedalWidget.fromMedalInfo(medal: medalInfo), + ), + ); + } catch (e, s) { + if (kDebugMode) { + Utils.reportError(e, s); + } + } + } return Align( alignment: Alignment.centerLeft, child: Builder( @@ -76,7 +92,7 @@ class LiveRoomChatPanel extends StatelessWidget { TextSpan( children: [ TextSpan( - text: '${item.name}: ', + text: item.name, style: TextStyle( color: nameColor, fontSize: 14, @@ -91,6 +107,14 @@ class LiveRoomChatPanel extends StatelessWidget { item, )), ), + ?medal, + TextSpan( + text: ': ', + style: TextStyle( + color: nameColor, + fontSize: 14, + ), + ), if (item.reply case final reply?) TextSpan( text: '@${reply.name} ', diff --git a/lib/pages/live_search/child/view.dart b/lib/pages/live_search/child/view.dart index 232a9ed8c..2c4447022 100644 --- a/lib/pages/live_search/child/view.dart +++ b/lib/pages/live_search/child/view.dart @@ -1,6 +1,6 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/msg_feed_top.dart'; import 'package:PiliPlus/common/skeleton/video_card_v.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -71,10 +71,10 @@ class _LiveSearchChildPageState extends State } late final roomDelegate = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Grid.smallCardWidth, - childAspectRatio: StyleString.aspectRatio, + childAspectRatio: Style.aspectRatio, mainAxisExtent: MediaQuery.textScalerOf(context).scale(60), ); diff --git a/lib/pages/live_search/widgets/live_search_room.dart b/lib/pages/live_search/widgets/live_search_room.dart index c5d44c14d..49993d439 100644 --- a/lib/pages/live_search/widgets/live_search_room.dart +++ b/lib/pages/live_search/widgets/live_search_room.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -32,7 +32,7 @@ class LiveCardVSearch extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/live_search/widgets/live_search_user.dart b/lib/pages/live_search/widgets/live_search_user.dart index 358824ae5..d201349a3 100644 --- a/lib/pages/live_search/widgets/live_search_user.dart +++ b/lib/pages/live_search/widgets/live_search_user.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models_new/live/live_search/user_item.dart'; @@ -53,7 +54,7 @@ class LiveSearchUserItem extends StatelessWidget { Image.asset( height: 14, cacheHeight: 14.cacheSize(context), - 'assets/images/live/live.gif', + Assets.livingRect, ), ], ], diff --git a/lib/pages/login/controller.dart b/lib/pages/login/controller.dart index 68414eab3..a33be8703 100644 --- a/lib/pages/login/controller.dart +++ b/lib/pages/login/controller.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:io'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/dial_prefix.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/radio_widget.dart'; import 'package:PiliPlus/http/init.dart'; @@ -39,7 +39,7 @@ class LoginPageController extends GetxController late final RxInt qrCodeLeftTime = 180.obs; late final RxString statusQRCode = ''.obs; - late var selectedCountryCodeId = Constants.internationalDialingPrefix.first; + late var selectedCountryCodeId = Login.dialPrefix.first; late String captchaKey = ''; late final RxInt smsSendCooldown = 0.obs; late int smsSendTimestamp = 0; diff --git a/lib/pages/login/view.dart b/lib/pages/login/view.dart index 01793e02f..df62625c5 100644 --- a/lib/pages/login/view.dart +++ b/lib/pages/login/view.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'dart:ui'; import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/dial_prefix.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; @@ -390,19 +391,18 @@ class _LoginPageState extends State { (context as Element).markNeedsBuild(); }, initialValue: _loginPageCtr.selectedCountryCodeId, - itemBuilder: (_) => - Constants.internationalDialingPrefix.map((item) { - return PopupMenuItem( - value: item, - child: Row( - children: [ - Text(item.cname), - const Spacer(), - Text("+${item.countryId}"), - ], - ), - ); - }).toList(), + itemBuilder: (_) => Login.dialPrefix.map((item) { + return PopupMenuItem( + value: item, + child: Row( + children: [ + Text(item.cname), + const Spacer(), + Text("+${item.countryId}"), + ], + ), + ); + }).toList(), child: Row( children: [ Icon( diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index d79fe82fd..034a974f7 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -1,6 +1,8 @@ import 'dart:io'; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/pop_scope.dart'; import 'package:PiliPlus/common/widgets/flutter/tabs.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -226,9 +228,9 @@ class _MainAppState extends PopScopeState Future _handleTray() async { if (Platform.isWindows) { - await trayManager.setIcon('assets/images/logo/ico/app_icon.ico'); + await trayManager.setIcon(Assets.logoIco); } else { - await trayManager.setIcon('assets/images/logo/desktop/logo_large.png'); + await trayManager.setIcon(Assets.logoLarge); } if (!Platform.isLinux) { await trayManager.setToolTip(Constants.appName); @@ -312,7 +314,7 @@ class _MainAppState extends PopScopeState () => FractionalTranslation( translation: Offset( 0.0, - barOffset.value / StyleString.topBarHeight, + barOffset.value / Style.topBarHeight, ), child: bottomNav, ), diff --git a/lib/pages/main_reply/view.dart b/lib/pages/main_reply/view.dart index a87fc0933..4f816abbf 100644 --- a/lib/pages/main_reply/view.dart +++ b/lib/pages/main_reply/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_reply.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart'; @@ -194,7 +194,7 @@ class _MainReplyPageState extends State }, ), TextButton.icon( - style: StyleString.buttonStyle, + style: Style.buttonStyle, onPressed: _controller.queryBySort, icon: Icon(Icons.sort, size: 16, color: secondary), label: Obx( diff --git a/lib/pages/member/widget/header_layout_widget.dart b/lib/pages/member/widget/header_layout_widget.dart index de18a775b..19a922182 100644 --- a/lib/pages/member/widget/header_layout_widget.dart +++ b/lib/pages/member/widget/header_layout_widget.dart @@ -23,7 +23,6 @@ import 'package:flutter/rendering.dart' show BoxHitTestResult, BoxParentData; const double kHeaderHeight = 135.0; const double kAvatarSize = 80.0; -const double kPendantAvatarSize = 70.0; const double _kAvatarLeftPadding = 20.0; const double _kAvatarTopPadding = 115.0; const double _kAvatarEffectiveHeight = diff --git a/lib/pages/member/widget/medal_wall.dart b/lib/pages/member/widget/medal_wall.dart index 82621e6cd..1e7fe6094 100644 --- a/lib/pages/member/widget/medal_wall.dart +++ b/lib/pages/member/widget/medal_wall.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; import 'package:PiliPlus/models_new/live/live_medal_wall/data.dart'; @@ -6,8 +7,6 @@ import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/page_utils.dart'; -import 'package:PiliPlus/utils/utils.dart'; -import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; class MedalWall extends StatelessWidget { @@ -71,42 +70,6 @@ class MedalWall extends StatelessWidget { final item = response.list![index]; final uinfoMedal = item.uinfoMedal!; final isLiving = item.liveStatus == 1; - Color? nameColor; - Color? backgroundColor; - try { - nameColor = Utils.parseColor(uinfoMedal.v2MedalColorText!); - backgroundColor = Utils.parseMedalColor( - uinfoMedal.v2MedalColorStart!, - ); - } catch (e, s) { - if (kDebugMode) { - Utils.reportError(e, s); - } - } - final medal = MedalWidget( - medalName: uinfoMedal.name!, - level: uinfoMedal.level!, - backgroundColor: - backgroundColor ?? colorScheme.secondaryContainer, - nameColor: nameColor ?? colorScheme.onSecondaryContainer, - levelColor: nameColor ?? colorScheme.onSecondaryContainer, - ); - Widget avatar = PendantAvatar( - avatar: item.targetIcon, - size: 38, - officialType: switch (item.official) { - 1 => 0, - 2 => 1, - _ => null, - }, - ); - if (isLiving) { - avatar = GestureDetector( - onTap: () => - PageUtils.toDupNamed('/member?mid=${uinfoMedal.ruid}'), - child: avatar, - ); - } return ListTile( onTap: () { if (isLiving) { @@ -115,8 +78,21 @@ class MedalWall extends StatelessWidget { PageUtils.toDupNamed('/member?mid=${uinfoMedal.ruid}'); } }, - visualDensity: VisualDensity.comfortable, - leading: avatar, + visualDensity: .comfortable, + leading: PendantAvatar( + item.targetIcon, + size: 38, + officialType: switch (item.official) { + 1 => 0, + 2 => 1, + _ => null, + }, + onTap: isLiving + ? () => PageUtils.toDupNamed( + '/member?mid=${uinfoMedal.ruid}', + ) + : null, + ), title: Row( children: [ Flexible( @@ -131,7 +107,7 @@ class MedalWall extends StatelessWidget { Padding( padding: const .only(left: 4), child: Image.asset( - 'assets/images/live.gif', + Assets.livingChart, height: 16, cacheHeight: 16.cacheSize(context), color: colorScheme.primary, @@ -139,7 +115,7 @@ class MedalWall extends StatelessWidget { ), Padding( padding: const .only(left: 8), - child: medal, + child: MedalWidget.fromMedalInfo(medal: uinfoMedal), ), ], ), diff --git a/lib/pages/member/widget/medal_widget.dart b/lib/pages/member/widget/medal_widget.dart index 6693331c7..8fec03bb1 100644 --- a/lib/pages/member/widget/medal_widget.dart +++ b/lib/pages/member/widget/medal_widget.dart @@ -1,6 +1,12 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; +import 'package:PiliPlus/models_new/live/live_medal_wall/uinfo_medal.dart'; +import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; +const _kFontSize = 10.0; +const _kStrutStyle = StrutStyle(height: 1, leading: 0, fontSize: _kFontSize); +const _kPadding = EdgeInsets.symmetric(horizontal: 8, vertical: 3); + class MedalWidget extends StatelessWidget { const MedalWidget({ super.key, @@ -8,36 +14,47 @@ class MedalWidget extends StatelessWidget { required this.level, required this.backgroundColor, required this.nameColor, - required this.levelColor, + this.fontSize = _kFontSize, + this.strutStyle = _kStrutStyle, + this.padding = _kPadding, }); + MedalWidget.fromMedalInfo({ + super.key, + required UinfoMedal medal, + this.fontSize = _kFontSize, + this.strutStyle = _kStrutStyle, + this.padding = _kPadding, + }) : medalName = medal.name!, + level = medal.level!, + backgroundColor = Utils.parseMedalColor(medal.v2MedalColorStart!), + nameColor = Utils.parseColor(medal.v2MedalColorText!); + final String medalName; final int level; final Color backgroundColor; final Color nameColor; - final Color levelColor; + final double fontSize; + final StrutStyle strutStyle; + final EdgeInsets padding; @override Widget build(BuildContext context) { return Container( - padding: const .symmetric(horizontal: 8, vertical: 3), + padding: padding, decoration: BoxDecoration( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, color: backgroundColor, ), child: Text.rich( - strutStyle: const StrutStyle( - height: 1, - leading: 0, - fontSize: 10, - ), + strutStyle: strutStyle, TextSpan( children: [ TextSpan( text: medalName, style: TextStyle( height: 1, - fontSize: 10, + fontSize: fontSize, color: nameColor, ), ), @@ -45,9 +62,9 @@ class MedalWidget extends StatelessWidget { text: ' $level', style: TextStyle( height: 1, - fontSize: 10, + fontSize: fontSize, + color: nameColor, fontWeight: .bold, - color: levelColor, ), ), ], diff --git a/lib/pages/member/widget/user_info_card.dart b/lib/pages/member/widget/user_info_card.dart index 5e5a3fdb5..df949170a 100644 --- a/lib/pages/member/widget/user_info_card.dart +++ b/lib/pages/member/widget/user_info_card.dart @@ -1,4 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/avatars.dart'; import 'package:PiliPlus/common/widgets/image_viewer/hero.dart'; import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; @@ -135,11 +136,9 @@ class UserInfoCard extends StatelessWidget { Widget? liveMedal; if (card.liveFansWearing?.detailV2 case final detailV2?) { Color? nameColor; - Color? levelColor; Color? backgroundColor; try { nameColor = Utils.parseColor(detailV2.medalColorName!); - levelColor = Utils.parseColor(detailV2.medalColorLevel!); backgroundColor = Utils.parseColor(detailV2.medalColor!); } catch (e, s) { if (kDebugMode) { @@ -154,7 +153,6 @@ class UserInfoCard extends StatelessWidget { level: detailV2.level!, backgroundColor: backgroundColor ?? colorScheme.secondaryContainer, nameColor: nameColor ?? colorScheme.onSecondaryContainer, - levelColor: levelColor ?? colorScheme.onSecondaryContainer, ), ); } catch (e, s) { @@ -204,7 +202,7 @@ class UserInfoCard extends StatelessWidget { Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3), decoration: BoxDecoration( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, color: colorScheme.vipColor, ), child: Text( @@ -475,23 +473,36 @@ class UserInfoCard extends StatelessWidget { ], ); - Widget _buildAvatar(bool hasPendant) => fromHero( - tag: '${card.face}$hashCode', - child: PendantAvatar( - avatar: card.face, - size: hasPendant ? kPendantAvatarSize : kAvatarSize, - isMemberAvatar: true, + Widget _buildAvatar(ColorScheme scheme) { + final pendant = card.pendant?.image; + Widget child = PendantAvatar( + card.face, + size: kAvatarSize, + pendentOffset: 12, badgeSize: 20, officialType: card.officialVerify?.type, - isVip: (card.vip?.status ?? -1) > 0, - garbPendantImage: card.pendant?.image, + vipStatus: card.vip?.status, + pendantImage: pendant, roomId: live?.liveStatus == 1 ? live!.roomid : null, onTap: () => PageUtils.imageView( tag: hashCode.toString(), imgList: [SourceModel(url: card.face.http2https)], ), - ), - ); + ); + if (pendant == null || pendant.isEmpty) { + child = DecoratedBox( + decoration: BoxDecoration( + border: .all(width: 2, color: scheme.surface), + shape: .circle, + ), + child: Padding(padding: const .all(2), child: child), + ); + } + return fromHero( + tag: '${card.face}$hashCode', + child: child, + ); + } Column _buildV( BuildContext context, @@ -499,7 +510,6 @@ class UserInfoCard extends StatelessWidget { bool isLight, double width, ) { - final hasPendant = card.pendant?.image?.isNotEmpty ?? false; final imgUrls = images.collectionTopSimple?.top?.imgUrls; return Column( mainAxisSize: MainAxisSize.min, @@ -519,7 +529,7 @@ class UserInfoCard extends StatelessWidget { : images.nightImgurl) .http2https, ), - avatar: _buildAvatar(hasPendant), + avatar: _buildAvatar(scheme), actions: _buildRight(scheme), ), const SizedBox(height: 5), @@ -591,26 +601,28 @@ class UserInfoCard extends StatelessWidget { Positioned( right: 0, bottom: 3.5, - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 125), - child: DecoratedBox( - decoration: const BoxDecoration( - gradient: LinearGradient( - begin: .centerLeft, - end: .centerRight, - colors: [ - Colors.transparent, - Colors.black12, - Colors.black38, - Colors.black45, - ], + child: IgnorePointer( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 125), + child: DecoratedBox( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: .centerLeft, + end: .centerRight, + colors: [ + Colors.transparent, + Colors.black12, + Colors.black38, + Colors.black45, + ], + ), ), - ), - child: Padding( - padding: const .only(left: 15, right: 5, bottom: 2), - child: HeaderTitle( - images: imgUrls, - pageController: controller, + child: Padding( + padding: const .only(left: 15, right: 5, bottom: 2), + child: HeaderTitle( + images: imgUrls, + pageController: controller, + ), ), ), ), @@ -728,7 +740,7 @@ class UserInfoCard extends StatelessWidget { return child; } - Column _buildH(BuildContext context, ColorScheme colorScheme, bool isLight) => + Column _buildH(BuildContext context, ColorScheme scheme, bool isLight) => Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, @@ -743,7 +755,7 @@ class UserInfoCard extends StatelessWidget { top: 10, bottom: card.prInfo?.content?.isNotEmpty == true ? 0 : 10, ), - child: _buildAvatar(card.pendant?.image?.isNotEmpty ?? false), + child: _buildAvatar(scheme), ), const SizedBox(width: 10), Expanded( @@ -753,20 +765,20 @@ class UserInfoCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 10), - ..._buildLeft(context, colorScheme, isLight), + ..._buildLeft(context, scheme, isLight), const SizedBox(height: 5), ], ), ), Expanded( flex: 3, - child: _buildRight(colorScheme), + child: _buildRight(scheme), ), const SizedBox(width: 20), ], ), if (card.prInfo?.content?.isNotEmpty == true) - buildPrInfo(context, colorScheme, isLight, card.prInfo!), + buildPrInfo(context, scheme, isLight, card.prInfo!), ], ); @@ -921,7 +933,7 @@ class _HeaderTitleState extends State { title.subTitle!, style: TextStyle( fontSize: 12, - fontFamily: 'digital_id_num', + fontFamily: Assets.digitalNum, color: title.subTitleColorFormat?.colors?.isNotEmpty == true ? Utils.parseMedalColor( title.subTitleColorFormat!.colors!.last, diff --git a/lib/pages/member_article/widget/item.dart b/lib/pages/member_article/widget/item.dart index 931048d58..19bda1ef5 100644 --- a/lib/pages/member_article/widget/item.dart +++ b/lib/pages/member_article/widget/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -34,7 +34,7 @@ class MemberArticleItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( @@ -42,7 +42,7 @@ class MemberArticleItem extends StatelessWidget { children: [ if (item.originImageUrls?.firstOrNull?.isNotEmpty == true) ...[ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (BuildContext context, BoxConstraints boxConstraints) { diff --git a/lib/pages/member_audio/view.dart b/lib/pages/member_audio/view.dart index 1e0f978f4..78ce6f192 100644 --- a/lib/pages/member_audio/view.dart +++ b/lib/pages/member_audio/view.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; @@ -66,7 +66,7 @@ class _MemberAudioState extends State late final gridDelegate = SliverGridDelegateWithExtentAndRatio( mainAxisSpacing: 2, maxCrossAxisExtent: Grid.smallCardWidth * 2, - childAspectRatio: StyleString.aspectRatio * 2.6, + childAspectRatio: Style.aspectRatio * 2.6, minHeight: MediaQuery.textScalerOf(context).scale(90), ); @@ -93,7 +93,7 @@ class _MemberAudioState extends State Padding( padding: const EdgeInsets.only(left: 6), child: TextButton.icon( - style: StyleString.buttonStyle, + style: Style.buttonStyle, onPressed: _controller.toViewPlayAll, icon: Icon( Icons.play_circle_outline_rounded, diff --git a/lib/pages/member_audio/widgets/item.dart b/lib/pages/member_audio/widgets/item.dart index 4892e4ed0..bc694086d 100644 --- a/lib/pages/member_audio/widgets/item.dart +++ b/lib/pages/member_audio/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -35,7 +35,7 @@ class MemberAudioItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( diff --git a/lib/pages/member_cheese/widgets/item.dart b/lib/pages/member_cheese/widgets/item.dart index d999e48f8..ff1a72086 100644 --- a/lib/pages/member_cheese/widgets/item.dart +++ b/lib/pages/member_cheese/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; @@ -81,14 +81,14 @@ class MemberCheeseItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { Widget child = NetworkImgLayer( diff --git a/lib/pages/member_coin_arc/view.dart b/lib/pages/member_coin_arc/view.dart index 1c30638eb..43de1ecab 100644 --- a/lib/pages/member_coin_arc/view.dart +++ b/lib/pages/member_coin_arc/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_v.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -57,8 +57,8 @@ class _MemberCoinArcPageState extends State { SliverPadding( padding: EdgeInsets.only( top: 7, - left: StyleString.safeSpace + padding.left, - right: StyleString.safeSpace + padding.right, + left: Style.safeSpace + padding.left, + right: Style.safeSpace + padding.right, bottom: padding.bottom + 100, ), sliver: Obx(() => _buildBody(_ctr.loadingState.value)), @@ -70,10 +70,10 @@ class _MemberCoinArcPageState extends State { } late final gridDelegate = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Grid.smallCardWidth, - childAspectRatio: StyleString.aspectRatio, + childAspectRatio: Style.aspectRatio, mainAxisExtent: MediaQuery.textScalerOf(context).scale(75), ); diff --git a/lib/pages/member_coin_arc/widgets/item.dart b/lib/pages/member_coin_arc/widgets/item.dart index b9feaa0d0..58bdea785 100644 --- a/lib/pages/member_coin_arc/widgets/item.dart +++ b/lib/pages/member_coin_arc/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -59,7 +59,7 @@ class MemberCoinLikeItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/member_comic/widgets/item.dart b/lib/pages/member_comic/widgets/item.dart index 8ac6a2b86..c1e456440 100644 --- a/lib/pages/member_comic/widgets/item.dart +++ b/lib/pages/member_comic/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -35,7 +35,7 @@ class MemberComicItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( diff --git a/lib/pages/member_favorite/widget/item.dart b/lib/pages/member_favorite/widget/item.dart index 7768b0a69..33f94627e 100644 --- a/lib/pages/member_favorite/widget/item.dart +++ b/lib/pages/member_favorite/widget/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -54,7 +54,7 @@ class MemberFavItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( @@ -64,7 +64,7 @@ class MemberFavItem extends StatelessWidget { clipBehavior: Clip.none, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, constraints) => NetworkImgLayer( src: item.cover, diff --git a/lib/pages/member_home/view.dart b/lib/pages/member_home/view.dart index 150b02a52..d8c6e3acc 100644 --- a/lib/pages/member_home/view.dart +++ b/lib/pages/member_home/view.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/button/more_btn.dart'; import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -45,23 +45,23 @@ class _MemberHomeState extends State } late final gridDelegateV = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Grid.smallCardWidth, - childAspectRatio: StyleString.aspectRatio, + childAspectRatio: Style.aspectRatio, mainAxisExtent: MediaQuery.textScalerOf(context).scale(55), ); late final gridDelegateAudio = SliverGridDelegateWithExtentAndRatio( mainAxisSpacing: 2, maxCrossAxisExtent: Grid.smallCardWidth * 2, - childAspectRatio: StyleString.aspectRatio * 2.6, + childAspectRatio: Style.aspectRatio * 2.6, minHeight: MediaQuery.textScalerOf(context).scale(90), ); late final gridDelegatePgc = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Grid.smallCardWidth * 0.6, childAspectRatio: 0.75, mainAxisExtent: MediaQuery.textScalerOf(context).scale(52), @@ -88,7 +88,7 @@ class _MemberHomeState extends State ), SliverPadding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, ), sliver: SliverGrid.builder( gridDelegate: gridDelegateV, @@ -131,7 +131,7 @@ class _MemberHomeState extends State ), SliverPadding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, ), sliver: SliverGrid.builder( gridDelegate: gridDelegateV, @@ -157,7 +157,7 @@ class _MemberHomeState extends State ), SliverPadding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, ), sliver: SliverGrid.builder( gridDelegate: gridDelegateV, @@ -234,7 +234,7 @@ class _MemberHomeState extends State ), SliverPadding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, ), sliver: SliverGrid.builder( gridDelegate: gridDelegatePgc, diff --git a/lib/pages/member_home/widgets/fav_item.dart b/lib/pages/member_home/widgets/fav_item.dart index 4247ad604..138ba9540 100644 --- a/lib/pages/member_home/widgets/fav_item.dart +++ b/lib/pages/member_home/widgets/fav_item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models_new/space/space_fav/list.dart'; @@ -34,7 +34,7 @@ class MemberFavItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( diff --git a/lib/pages/member_home/widgets/video_card_v_member_home.dart b/lib/pages/member_home/widgets/video_card_v_member_home.dart index 95be864dd..24aa8ae48 100644 --- a/lib/pages/member_home/widgets/video_card_v_member_home.dart +++ b/lib/pages/member_home/widgets/video_card_v_member_home.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -80,7 +80,7 @@ class VideoCardVMemberHome extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/member_like_arc/view.dart b/lib/pages/member_like_arc/view.dart index 6bc9f9d36..48ae86c2c 100644 --- a/lib/pages/member_like_arc/view.dart +++ b/lib/pages/member_like_arc/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_v.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -57,8 +57,8 @@ class _MemberLikeArcPageState extends State { SliverPadding( padding: EdgeInsets.only( top: 7, - left: StyleString.safeSpace + padding.left, - right: StyleString.safeSpace + padding.right, + left: Style.safeSpace + padding.left, + right: Style.safeSpace + padding.right, bottom: padding.bottom + 100, ), sliver: Obx(() => _buildBody(_ctr.loadingState.value)), @@ -70,10 +70,10 @@ class _MemberLikeArcPageState extends State { } late final gridDelegate = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Grid.smallCardWidth, - childAspectRatio: StyleString.aspectRatio, + childAspectRatio: Style.aspectRatio, mainAxisExtent: MediaQuery.textScalerOf(context).scale(75), ); diff --git a/lib/pages/member_opus/view.dart b/lib/pages/member_opus/view.dart index e04998d42..bbc67d92b 100644 --- a/lib/pages/member_opus/view.dart +++ b/lib/pages/member_opus/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/space_opus.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -59,8 +59,8 @@ class _MemberOpusState extends State SliverPadding( padding: EdgeInsets.only( top: widget.isSingle ? 12 : 0, - left: StyleString.safeSpace, - right: StyleString.safeSpace, + left: Style.safeSpace, + right: Style.safeSpace, bottom: bottom + 100, ), sliver: Obx(() => _buildBody(_controller.loadingState.value)), @@ -123,8 +123,8 @@ class _MemberOpusState extends State late final gridDelegate = SliverWaterfallFlowDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: Grid.smallCardWidth, - mainAxisSpacing: StyleString.safeSpace, - crossAxisSpacing: StyleString.safeSpace, + mainAxisSpacing: Style.safeSpace, + crossAxisSpacing: Style.safeSpace, ); Widget _buildBody(LoadingState?> loadingState) { diff --git a/lib/pages/member_pgc/view.dart b/lib/pages/member_pgc/view.dart index c38be8de9..1280415b7 100644 --- a/lib/pages/member_pgc/view.dart +++ b/lib/pages/member_pgc/view.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -52,9 +52,9 @@ class _MemberBangumiState extends State slivers: [ SliverPadding( padding: EdgeInsets.only( - left: StyleString.safeSpace, - right: StyleString.safeSpace, - top: StyleString.safeSpace, + left: Style.safeSpace, + right: Style.safeSpace, + top: Style.safeSpace, bottom: MediaQuery.viewPaddingOf(context).bottom + 100, ), sliver: Obx( @@ -67,8 +67,8 @@ class _MemberBangumiState extends State } late final gridDelegate = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Grid.smallCardWidth * 0.6, childAspectRatio: 0.75, mainAxisExtent: MediaQuery.textScalerOf(context).scale(52), diff --git a/lib/pages/member_pgc/widgets/pgc_card_v_member_pgc.dart b/lib/pages/member_pgc/widgets/pgc_card_v_member_pgc.dart index bd41ee22f..cd6c38249 100644 --- a/lib/pages/member_pgc/widgets/pgc_card_v_member_pgc.dart +++ b/lib/pages/member_pgc/widgets/pgc_card_v_member_pgc.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -23,9 +23,9 @@ class PgcCardVMemberPgc extends StatelessWidget { cover: item.cover, ); return Card( - shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius), + shape: const RoundedRectangleBorder(borderRadius: Style.mdRadius), child: InkWell( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, onTap: () => PageUtils.viewPgc(seasonId: item.param), onLongPress: onLongPress, onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, diff --git a/lib/pages/member_season_series/widget/season_series_card.dart b/lib/pages/member_season_series/widget/season_series_card.dart index b6d9c854a..a6400026e 100644 --- a/lib/pages/member_season_series/widget/season_series_card.dart +++ b/lib/pages/member_season_series/widget/season_series_card.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -31,14 +31,14 @@ class SeasonSeriesCard extends StatelessWidget { onTap: onTap, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (BuildContext context, BoxConstraints boxConstraints) { final double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/member_shop/view.dart b/lib/pages/member_shop/view.dart index 08c79f5b8..8d8120f93 100644 --- a/lib/pages/member_shop/view.dart +++ b/lib/pages/member_shop/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/space_opus.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -51,8 +51,8 @@ class _MemberShopState extends State SliverPadding( padding: EdgeInsets.only( top: 12, - left: StyleString.safeSpace, - right: StyleString.safeSpace, + left: Style.safeSpace, + right: Style.safeSpace, bottom: MediaQuery.viewPaddingOf(context).bottom + 100, ), sliver: Obx(() => _buildBody(_controller.loadingState.value)), @@ -67,8 +67,8 @@ class _MemberShopState extends State late final gridDelegate = SliverWaterfallFlowDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: Grid.smallCardWidth, - mainAxisSpacing: StyleString.safeSpace, - crossAxisSpacing: StyleString.safeSpace, + mainAxisSpacing: Style.safeSpace, + crossAxisSpacing: Style.safeSpace, ); Widget _buildBody(LoadingState?> loadingState) { diff --git a/lib/pages/member_video/view.dart b/lib/pages/member_video/view.dart index 2a9096755..145b433f3 100644 --- a/lib/pages/member_video/view.dart +++ b/lib/pages/member_video/view.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; @@ -201,7 +201,7 @@ class _MemberVideoState extends State : 0, ), child: TextButton.icon( - style: StyleString.buttonStyle, + style: Style.buttonStyle, onPressed: _controller.toViewPlayAll, icon: Icon( Icons.play_circle_outline_rounded, @@ -222,7 +222,7 @@ class _MemberVideoState extends State ), const Spacer(), TextButton.icon( - style: StyleString.buttonStyle, + style: Style.buttonStyle, onPressed: _controller.queryBySort, icon: Icon( Icons.sort, diff --git a/lib/pages/member_video/widgets/video_card_h_member_video.dart b/lib/pages/member_video/widgets/video_card_h_member_video.dart index 2744d9d35..e187acc6b 100644 --- a/lib/pages/member_video/widgets/video_card_h_member_video.dart +++ b/lib/pages/member_video/widgets/video_card_h_member_video.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -75,14 +75,14 @@ class VideoCardHMemberVideo extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { final double maxWidth = boxConstraints.maxWidth; @@ -99,7 +99,7 @@ class VideoCardHMemberVideo extends StatelessWidget { const Positioned.fill( child: DecoratedBox( decoration: BoxDecoration( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, color: Colors.black54, ), child: Center( diff --git a/lib/pages/mine/view.dart b/lib/pages/mine/view.dart index c5a04528f..e133eb72a 100644 --- a/lib/pages/mine/view.dart +++ b/lib/pages/mine/view.dart @@ -1,6 +1,7 @@ import 'dart:async'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/list_tile.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -106,7 +107,7 @@ class _MediaPageState extends CommonPageState (e) => Flexible( child: InkWell( onTap: e.onTap, - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 80), child: AspectRatio( @@ -273,7 +274,7 @@ class _MediaPageState extends CommonPageState right: -1, bottom: -2, child: Image.asset( - 'assets/images/big-vip.png', + Assets.vipIcon, height: 19, cacheHeight: 19.cacheSize(context), semanticLabel: "大会员", @@ -286,7 +287,7 @@ class _MediaPageState extends CommonPageState width: 55, height: 55, cacheHeight: 55.cacheSize(context), - 'assets/images/noface.jpeg', + Assets.avatarPlaceHolder, semanticLabel: "默认头像", ), ), @@ -414,7 +415,7 @@ class _MediaPageState extends CommonPageState return Flexible( child: InkWell( onTap: onTap, - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 80), child: AspectRatio( diff --git a/lib/pages/music/widget/music_video_card_h.dart b/lib/pages/music/widget/music_video_card_h.dart index 5e7b7f834..3ee2757d1 100644 --- a/lib/pages/music/widget/music_video_card_h.dart +++ b/lib/pages/music/widget/music_video_card_h.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -48,14 +48,14 @@ class MusicVideoCardH extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/pgc/view.dart b/lib/pages/pgc/view.dart index 8beed926d..d56e5fc4f 100644 --- a/lib/pages/pgc/view.dart +++ b/lib/pages/pgc/view.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/button/more_btn.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; @@ -170,9 +170,9 @@ class _PgcPageState extends State with AutomaticKeepAliveClientMixin { return Container( width: Grid.smallCardWidth / 2, margin: EdgeInsets.only( - left: StyleString.safeSpace, + left: Style.safeSpace, right: index == item.episodes!.length - 1 - ? StyleString.safeSpace + ? Style.safeSpace : 0, ), child: PgcCardVTimeline( @@ -208,8 +208,8 @@ class _PgcPageState extends State with AutomaticKeepAliveClientMixin { _buildRcmdTitle(theme), SliverPadding( padding: const EdgeInsets.only( - left: StyleString.safeSpace, - right: StyleString.safeSpace, + left: Style.safeSpace, + right: Style.safeSpace, bottom: 100, ), sliver: Obx( @@ -301,8 +301,8 @@ class _PgcPageState extends State with AutomaticKeepAliveClientMixin { ); late final gridDelegate = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Grid.smallCardWidth * 0.6, childAspectRatio: 0.75, mainAxisExtent: MediaQuery.textScalerOf(context).scale(50), @@ -412,10 +412,8 @@ class _PgcPageState extends State with AutomaticKeepAliveClientMixin { return Container( width: Grid.smallCardWidth / 2, margin: EdgeInsets.only( - left: StyleString.safeSpace, - right: index == response.length - 1 - ? StyleString.safeSpace - : 0, + left: Style.safeSpace, + right: index == response.length - 1 ? Style.safeSpace : 0, ), child: PgcCardV(item: response[index]), ); diff --git a/lib/pages/pgc/widgets/pgc_card_v.dart b/lib/pages/pgc/widgets/pgc_card_v.dart index 2f3c6b559..20774983d 100644 --- a/lib/pages/pgc/widgets/pgc_card_v.dart +++ b/lib/pages/pgc/widgets/pgc_card_v.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -25,9 +25,9 @@ class PgcCardV extends StatelessWidget { cover: item.cover, ); return Card( - shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius), + shape: const RoundedRectangleBorder(borderRadius: Style.mdRadius), child: InkWell( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, onLongPress: onLongPress, onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, onTap: () => PageUtils.viewPgc(seasonId: item.seasonId), diff --git a/lib/pages/pgc/widgets/pgc_card_v_timeline.dart b/lib/pages/pgc/widgets/pgc_card_v_timeline.dart index 85930eceb..d7b8410e5 100644 --- a/lib/pages/pgc/widgets/pgc_card_v_timeline.dart +++ b/lib/pages/pgc/widgets/pgc_card_v_timeline.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -25,9 +25,9 @@ class PgcCardVTimeline extends StatelessWidget { cover: item.cover, ); return Card( - shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius), + shape: const RoundedRectangleBorder(borderRadius: Style.mdRadius), child: InkWell( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, onLongPress: onLongPress, onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, onTap: () => diff --git a/lib/pages/pgc_index/view.dart b/lib/pages/pgc_index/view.dart index cf027ecb8..4da07b810 100644 --- a/lib/pages/pgc_index/view.dart +++ b/lib/pages/pgc_index/view.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart'; @@ -84,8 +84,8 @@ class _PgcIndexPageState extends State ), SliverPadding( padding: EdgeInsets.only( - left: StyleString.safeSpace, - right: StyleString.safeSpace, + left: Style.safeSpace, + right: Style.safeSpace, top: 12, bottom: padding.bottom + 100, ), @@ -224,8 +224,8 @@ class _PgcIndexPageState extends State ); late final gridDelegate = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Grid.smallCardWidth * 0.6, childAspectRatio: 0.75, mainAxisExtent: MediaQuery.textScalerOf(context).scale(50), diff --git a/lib/pages/pgc_index/widgets/pgc_card_v_pgc_index.dart b/lib/pages/pgc_index/widgets/pgc_card_v_pgc_index.dart index 5e50491dd..33ba16322 100644 --- a/lib/pages/pgc_index/widgets/pgc_card_v_pgc_index.dart +++ b/lib/pages/pgc_index/widgets/pgc_card_v_pgc_index.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -25,9 +25,9 @@ class PgcCardVPgcIndex extends StatelessWidget { cover: item.cover, ); return Card( - shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius), + shape: const RoundedRectangleBorder(borderRadius: Style.mdRadius), child: InkWell( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, onTap: () => PageUtils.viewPgc(seasonId: item.seasonId), onLongPress: onLongPress, onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, diff --git a/lib/pages/pgc_review/child/view.dart b/lib/pages/pgc_review/child/view.dart index c292b5d6d..c32c65378 100644 --- a/lib/pages/pgc_review/child/view.dart +++ b/lib/pages/pgc_review/child/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_reply.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; @@ -403,7 +403,7 @@ class _PgcReviewChildPageState extends State }, ), TextButton.icon( - style: StyleString.buttonStyle, + style: Style.buttonStyle, onPressed: _controller.queryBySort, icon: Icon( Icons.sort, diff --git a/lib/pages/rank/zone/widget/pgc_rank_item.dart b/lib/pages/rank/zone/widget/pgc_rank_item.dart index f26234c80..d821e5065 100644 --- a/lib/pages/rank/zone/widget/pgc_rank_item.dart +++ b/lib/pages/rank/zone/widget/pgc_rank_item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -32,7 +32,7 @@ class PgcRankItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( diff --git a/lib/pages/rcmd/view.dart b/lib/pages/rcmd/view.dart index 6ddd24077..cae5cd4b1 100644 --- a/lib/pages/rcmd/view.dart +++ b/lib/pages/rcmd/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_v.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/video_card/video_card_v.dart'; @@ -30,8 +30,8 @@ class _RcmdPageState extends State final colorScheme = ColorScheme.of(context); return Container( clipBehavior: .hardEdge, - margin: const .symmetric(horizontal: StyleString.safeSpace), - decoration: const BoxDecoration(borderRadius: StyleString.mdRadius), + margin: const .symmetric(horizontal: Style.safeSpace), + decoration: const BoxDecoration(borderRadius: Style.mdRadius), child: refreshIndicator( onRefresh: controller.onRefresh, child: CustomScrollView( @@ -39,7 +39,7 @@ class _RcmdPageState extends State physics: const AlwaysScrollableScrollPhysics(), slivers: [ SliverPadding( - padding: const .only(top: StyleString.cardSpace, bottom: 100), + padding: const .only(top: Style.cardSpace, bottom: 100), sliver: Obx( () => _buildBody(colorScheme, controller.loadingState.value), ), @@ -51,10 +51,10 @@ class _RcmdPageState extends State } late final gridDelegate = SliverGridDelegateWithExtentAndRatio( - mainAxisSpacing: StyleString.cardSpace, - crossAxisSpacing: StyleString.cardSpace, + mainAxisSpacing: Style.cardSpace, + crossAxisSpacing: Style.cardSpace, maxCrossAxisExtent: Pref.recommendCardWidth, - childAspectRatio: StyleString.aspectRatio, + childAspectRatio: Style.aspectRatio, mainAxisExtent: MediaQuery.textScalerOf(context).scale(90), ); diff --git a/lib/pages/save_panel/view.dart b/lib/pages/save_panel/view.dart index 21d6ef72c..fd2af540a 100644 --- a/lib/pages/save_panel/view.dart +++ b/lib/pages/save_panel/view.dart @@ -1,4 +1,6 @@ +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart' @@ -401,7 +403,7 @@ class _SavePanelState extends State { src: cover!, height: coverSize, width: coverType == .def16_9 - ? coverSize * StyleString.aspectRatio16x9 + ? coverSize * Style.aspectRatio16x9 : coverSize, quality: 100, borderRadius: const .all(.circular(6)), @@ -507,7 +509,7 @@ class _SavePanelState extends State { Align( alignment: .centerLeft, child: Image.asset( - 'assets/images/logo/logo_2.png', + Assets.logo2, width: 100, cacheWidth: 100.cacheSize(context), color: theme.colorScheme.onSurfaceVariant, diff --git a/lib/pages/search/widgets/hot_keyword.dart b/lib/pages/search/widgets/hot_keyword.dart index d7bb04ce6..20cf6a7e1 100644 --- a/lib/pages/search/widgets/hot_keyword.dart +++ b/lib/pages/search/widgets/hot_keyword.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/models_new/search/search_trending/list.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/image_utils.dart'; @@ -73,7 +74,7 @@ class SliverHotKeyword extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 4), child: Image.asset( - 'assets/images/live/live.gif', + Assets.livingRect, width: 48, height: 15, cacheHeight: cacheHeight, diff --git a/lib/pages/search_panel/all/view.dart b/lib/pages/search_panel/all/view.dart index 1a4c5f73e..5e346822d 100644 --- a/lib/pages/search_panel/all/view.dart +++ b/lib/pages/search_panel/all/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_h.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/video_card/video_card_h.dart'; import 'package:PiliPlus/models/search/result.dart'; import 'package:PiliPlus/pages/search_panel/all/controller.dart'; @@ -49,7 +49,7 @@ class _SearchAllPanelState return SliverWaterfallFlow( gridDelegate: SliverWaterfallFlowDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: Grid.smallCardWidth * 2, - crossAxisSpacing: StyleString.safeSpace, + crossAxisSpacing: Style.safeSpace, ), delegate: SliverChildBuilderDelegate( (_, index) { @@ -80,9 +80,9 @@ class _SearchAllPanelState return Container( width: Grid.smallCardWidth / 2, margin: EdgeInsets.only( - left: StyleString.safeSpace, + left: Style.safeSpace, right: index == e.length - 1 - ? StyleString.safeSpace + ? Style.safeSpace : 0, ), child: PgcCardVSearch(item: e[index]), diff --git a/lib/pages/search_panel/all/widgets/pgc_card_v_search.dart b/lib/pages/search_panel/all/widgets/pgc_card_v_search.dart index 4fe53f696..6ef7c9292 100644 --- a/lib/pages/search_panel/all/widgets/pgc_card_v_search.dart +++ b/lib/pages/search_panel/all/widgets/pgc_card_v_search.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -24,9 +24,9 @@ class PgcCardVSearch extends StatelessWidget { cover: item.cover, ); return Card( - shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius), + shape: const RoundedRectangleBorder(borderRadius: Style.mdRadius), child: InkWell( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, onLongPress: onLongPress, onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, onTap: () => PageUtils.viewPgc(seasonId: item.seasonId), diff --git a/lib/pages/search_panel/article/widgets/item.dart b/lib/pages/search_panel/article/widgets/item.dart index 40c707c0f..0d42347b8 100644 --- a/lib/pages/search_panel/article/widgets/item.dart +++ b/lib/pages/search_panel/article/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -38,7 +38,7 @@ class SearchArticleItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( @@ -46,7 +46,7 @@ class SearchArticleItem extends StatelessWidget { children: [ if (item.imageUrls?.isNotEmpty == true) AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/search_panel/live/view.dart b/lib/pages/search_panel/live/view.dart index d47f20ad6..67f5dc973 100644 --- a/lib/pages/search_panel/live/view.dart +++ b/lib/pages/search_panel/live/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_v.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/models/search/result.dart'; import 'package:PiliPlus/pages/search_panel/controller.dart'; import 'package:PiliPlus/pages/search_panel/live/widgets/item.dart'; @@ -46,9 +46,9 @@ class _SearchLivePanelState late final gridDelegate = SliverGridDelegateWithExtentAndRatio( maxCrossAxisExtent: Grid.smallCardWidth, - crossAxisSpacing: StyleString.cardSpace, - mainAxisSpacing: StyleString.cardSpace, - childAspectRatio: StyleString.aspectRatio, + crossAxisSpacing: Style.cardSpace, + mainAxisSpacing: Style.cardSpace, + childAspectRatio: Style.aspectRatio, mainAxisExtent: MediaQuery.textScalerOf(context).scale(80), ); @@ -56,8 +56,8 @@ class _SearchLivePanelState Widget buildList(ThemeData theme, List list) { return SliverPadding( padding: const EdgeInsets.only( - left: StyleString.safeSpace, - right: StyleString.safeSpace, + left: Style.safeSpace, + right: Style.safeSpace, ), sliver: SliverGrid.builder( gridDelegate: gridDelegate, diff --git a/lib/pages/search_panel/live/widgets/item.dart b/lib/pages/search_panel/live/widgets/item.dart index 58b42fb11..b52ac14e4 100644 --- a/lib/pages/search_panel/live/widgets/item.dart +++ b/lib/pages/search_panel/live/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -30,7 +30,7 @@ class LiveItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/search_panel/pgc/view.dart b/lib/pages/search_panel/pgc/view.dart index fe15e2628..154f41098 100644 --- a/lib/pages/search_panel/pgc/view.dart +++ b/lib/pages/search_panel/pgc/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/media_bangumi.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/models/search/result.dart'; import 'package:PiliPlus/pages/search_panel/controller.dart'; import 'package:PiliPlus/pages/search_panel/pgc/widgets/item.dart'; @@ -69,7 +69,7 @@ class _SearchPgcPanelState gridDelegate: SliverGridDelegateWithExtentAndRatio( mainAxisSpacing: 2, maxCrossAxisExtent: Grid.smallCardWidth * 2, - childAspectRatio: StyleString.aspectRatio * 1.5, + childAspectRatio: Style.aspectRatio * 1.5, minHeight: MediaQuery.textScalerOf(context).scale(155), ), itemBuilder: (context, index) => const MediaPgcSkeleton(), diff --git a/lib/pages/search_panel/pgc/widgets/item.dart b/lib/pages/search_panel/pgc/widgets/item.dart index 7cdc7600d..4aa1844d6 100644 --- a/lib/pages/search_panel/pgc/widgets/item.dart +++ b/lib/pages/search_panel/pgc/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -32,8 +32,8 @@ class SearchPgcItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, - vertical: StyleString.cardSpace, + horizontal: Style.safeSpace, + vertical: Style.cardSpace, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/pages/search_panel/user/widgets/item.dart b/lib/pages/search_panel/user/widgets/item.dart index 80d2fe2d5..434bde6cc 100644 --- a/lib/pages/search_panel/user/widgets/item.dart +++ b/lib/pages/search_panel/user/widgets/item.dart @@ -29,9 +29,8 @@ class SearchUserItem extends StatelessWidget { children: [ const SizedBox(width: 15), PendantAvatar( - avatar: item.upic, + item.upic, size: 42, - isVip: false, officialType: item.officialVerify?.type, roomId: item.isLive == 1 ? item.roomId : null, ), diff --git a/lib/pages/search_trending/view.dart b/lib/pages/search_trending/view.dart index 0e8a22ae2..d55756671 100644 --- a/lib/pages/search_trending/view.dart +++ b/lib/pages/search_trending/view.dart @@ -1,5 +1,6 @@ import 'dart:math'; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/widgets/flutter/list_tile.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; @@ -126,7 +127,7 @@ class _SearchTrendingPageState extends State { width: width, height: height, cacheWidth: width.cacheSize(context), - 'assets/images/trending_banner.png', + Assets.trendingBanner, filterQuality: FilterQuality.low, ), ), @@ -210,7 +211,7 @@ class _SearchTrendingPageState extends State { ] else if (item.showLiveIcon == true) ...[ const SizedBox(width: 4), Image.asset( - 'assets/images/live/live.gif', + Assets.livingRect, width: 51, height: 16, cacheHeight: 16.cacheSize(context), diff --git a/lib/pages/setting/models/model.dart b/lib/pages/setting/models/model.dart index 71124a5aa..3cc4ab771 100644 --- a/lib/pages/setting/models/model.dart +++ b/lib/pages/setting/models/model.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/models/common/enum_with_label.dart'; import 'package:PiliPlus/pages/setting/widgets/normal_item.dart'; import 'package:PiliPlus/pages/setting/widgets/popup_item.dart'; @@ -164,7 +164,7 @@ SettingsModel getBanWordModel({ showDialog( context: context, builder: (context) => AlertDialog( - constraints: StyleString.dialogFixedConstraints, + constraints: Style.dialogFixedConstraints, title: Text(title), content: Column( mainAxisSize: MainAxisSize.min, diff --git a/lib/pages/subscription/widgets/item.dart b/lib/pages/subscription/widgets/item.dart index c85f49565..66bee5feb 100644 --- a/lib/pages/subscription/widgets/item.dart +++ b/lib/pages/subscription/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -64,7 +64,7 @@ class SubItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/subscription_detail/widget/sub_video_card.dart b/lib/pages/subscription_detail/widget/sub_video_card.dart index 9d4bc46d2..fb1d99cd5 100644 --- a/lib/pages/subscription_detail/widget/sub_video_card.dart +++ b/lib/pages/subscription_detail/widget/sub_video_card.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -50,14 +50,14 @@ class SubVideoCardH extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { double maxWidth = boxConstraints.maxWidth; diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index 4f8a236c1..9659d871b 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'dart:math' show min; import 'dart:ui'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/pair.dart'; import 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart'; import 'package:PiliPlus/grpc/bilibili/app/listener/v1.pbenum.dart' @@ -1483,7 +1483,7 @@ class VideoDetailController extends GetxController showDialog( context: Get.context!, builder: (context) => AlertDialog( - constraints: StyleString.dialogFixedConstraints, + constraints: Style.dialogFixedConstraints, title: const Text('播放地址'), content: Column( spacing: 20, diff --git a/lib/pages/video/download_panel/view.dart b/lib/pages/video/download_panel/view.dart index 860f12d02..4672c527a 100644 --- a/lib/pages/video/download_panel/view.dart +++ b/lib/pages/video/download_panel/view.dart @@ -1,4 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -398,7 +399,7 @@ class _DownloadPanelState extends State { }, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( @@ -443,7 +444,7 @@ class _DownloadPanelState extends State { ) else if (isCurrentIndex) Image.asset( - 'assets/images/live.png', + Assets.livingStatic, color: primary, height: 12, cacheHeight: 12.cacheSize(context), diff --git a/lib/pages/video/introduction/local/view.dart b/lib/pages/video/introduction/local/view.dart index 83f219d95..bf8f16dd6 100644 --- a/lib/pages/video/introduction/local/view.dart +++ b/lib/pages/video/introduction/local/view.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; @@ -71,7 +71,7 @@ class _LocalIntroPanelState extends State }, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( @@ -82,7 +82,7 @@ class _LocalIntroPanelState extends State children: [ cover.existsSync() ? ClipRRect( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, child: Image.file( cover, width: 140.8, diff --git a/lib/pages/video/introduction/pgc/view.dart b/lib/pages/video/introduction/pgc/view.dart index ceb91efe0..4a124dc5d 100644 --- a/lib/pages/video/introduction/pgc/view.dart +++ b/lib/pages/video/introduction/pgc/view.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; @@ -104,7 +104,7 @@ class _PgcIntroPageState extends State { } return SliverPadding( padding: - const EdgeInsets.all(StyleString.safeSpace) + + const EdgeInsets.all(Style.safeSpace) + const EdgeInsets.only(bottom: 50), sliver: sliver, ); diff --git a/lib/pages/video/introduction/pgc/widgets/pgc_panel.dart b/lib/pages/video/introduction/pgc/widgets/pgc_panel.dart index faf28dcc8..3a9fa0141 100644 --- a/lib/pages/video/introduction/pgc/widgets/pgc_panel.dart +++ b/lib/pages/video/introduction/pgc/widgets/pgc_panel.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/new_ep.dart'; import 'package:PiliPlus/models_new/video/video_detail/episode.dart' @@ -189,7 +190,7 @@ class _PgcPanelState extends State { child: Padding( padding: const EdgeInsets.only(right: 6), child: Image.asset( - 'assets/images/live.png', + Assets.livingStatic, color: theme.primary, height: 12, cacheHeight: 12.cacheSize(context), @@ -212,7 +213,7 @@ class _PgcPanelState extends State { const SizedBox(width: 2), if (item.badge == '会员') Image.asset( - 'assets/images/big-vip.png', + Assets.vipIcon, height: 16, cacheHeight: 16.cacheSize(context), semanticLabel: "大会员", diff --git a/lib/pages/video/introduction/ugc/view.dart b/lib/pages/video/introduction/ugc/view.dart index d42a0fcfc..2d0199ec3 100644 --- a/lib/pages/video/introduction/ugc/view.dart +++ b/lib/pages/video/introduction/ugc/view.dart @@ -1,4 +1,6 @@ +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/flutter/selectable_text/selection_area.dart'; import 'package:PiliPlus/common/widgets/flutter/selectable_text/text.dart'; @@ -92,8 +94,8 @@ class _UgcIntroPanelState extends State { final isHorizontal = !isPortrait && widget.isHorizontal; return SliverPadding( padding: const EdgeInsets.only( - left: StyleString.safeSpace, - right: StyleString.safeSpace, + left: Style.safeSpace, + right: Style.safeSpace, top: 10, ), sliver: Obx( @@ -913,10 +915,10 @@ class _UgcIntroPanelState extends State { mainAxisSize: MainAxisSize.min, children: [ PendantAvatar( - avatar: userStat.card?.face, + userStat.card?.face, size: 35, badgeSize: 14, - isVip: isVip, + vipStatus: userStat.card?.vip?.status, officialType: userStat.card?.official?.type, ), const SizedBox(width: 10), @@ -1012,7 +1014,7 @@ class _UgcIntroPanelState extends State { }, child: Image.asset( semanticLabel: 'AI总结', - 'assets/images/ai.png', + Assets.ai, height: 18, width: 18, cacheHeight: 18.cacheSize(context), diff --git a/lib/pages/video/introduction/ugc/widgets/page.dart b/lib/pages/video/introduction/ugc/widgets/page.dart index 54859d337..5b249cc2e 100644 --- a/lib/pages/video/introduction/ugc/widgets/page.dart +++ b/lib/pages/video/introduction/ugc/widgets/page.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:math'; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/models_new/video/video_detail/page.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/controller.dart'; @@ -197,7 +198,7 @@ class _PagesPanelState extends State { children: [ if (isCurrentIndex) ...[ Image.asset( - 'assets/images/live.png', + Assets.livingStatic, color: theme.colorScheme.primary, height: 12, cacheHeight: 12.cacheSize(context), diff --git a/lib/pages/video/introduction/ugc/widgets/season.dart b/lib/pages/video/introduction/ugc/widgets/season.dart index cf0ee0fe0..4120d8638 100644 --- a/lib/pages/video/introduction/ugc/widgets/season.dart +++ b/lib/pages/video/introduction/ugc/widgets/season.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/models_new/video/video_detail/data.dart'; import 'package:PiliPlus/models_new/video/video_detail/episode.dart'; import 'package:PiliPlus/models_new/video/video_detail/section.dart'; @@ -126,7 +127,7 @@ class _SeasonPanelState extends State { ), const SizedBox(width: 15), Image.asset( - 'assets/images/live.png', + Assets.livingStatic, color: theme.colorScheme.primary, height: 12, cacheHeight: 12.cacheSize(context), diff --git a/lib/pages/video/member/view.dart b/lib/pages/video/member/view.dart index 26105ac74..f3715661f 100644 --- a/lib/pages/video/member/view.dart +++ b/lib/pages/video/member/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_h.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; @@ -138,7 +138,7 @@ class _HorizontalMemberPageState extends State { }, ), TextButton.icon( - style: StyleString.buttonStyle, + style: Style.buttonStyle, onPressed: () => _controller ..lastAid = widget.videoDetailController.aid.toString() ..queryBySort(), diff --git a/lib/pages/video/pay_coins/view.dart b/lib/pages/video/pay_coins/view.dart index 53db2a1a5..69c79a416 100644 --- a/lib/pages/video/pay_coins/view.dart +++ b/lib/pages/video/pay_coins/view.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:math' as math; import 'dart:math' show max; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/pages/common/publish/publish_route.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; @@ -76,9 +77,9 @@ class _PayCoinsPageState extends State Timer? _timer; late final RxInt _thunderIndex = (-1).obs; static const List _thunderImages = [ - 'assets/images/paycoins/ic_thunder_1.png', - 'assets/images/paycoins/ic_thunder_2.png', - 'assets/images/paycoins/ic_thunder_3.png', + Assets.thunder1, + Assets.thunder2, + Assets.thunder3, ]; void _cancelTimer() { _timer?.cancel(); @@ -99,11 +100,9 @@ class _PayCoinsPageState extends State String _getPayImage(int index, bool canPay) { if (!canPay) { - return 'assets/images/paycoins/ic_22_not_enough_pay.png'; + return Assets.notEnough; } - return index == 0 - ? 'assets/images/paycoins/ic_22_mario.png' - : 'assets/images/paycoins/ic_22_gun_sister.png'; + return index == 0 ? Assets.mario : Assets.gunSister; } late final color = Colors.black.withValues(alpha: 0.4); @@ -215,9 +214,7 @@ class _PayCoinsPageState extends State children: [ SlideTransition( position: _boxAnim, - child: Image.asset( - 'assets/images/paycoins/ic_pay_coins_box.png', - ), + child: Image.asset(Assets.payBox), ), SlideTransition( position: _coinSlideAnim, @@ -226,9 +223,7 @@ class _PayCoinsPageState extends State child: Image.asset( height: 35 + (factor * 15), width: 35 + (factor * 15), - index == 0 - ? 'assets/images/paycoins/ic_coins_one.png' - : 'assets/images/paycoins/ic_coins_two.png', + index == 0 ? Assets.coinsOne : Assets.coinsTwo, ), ), ), @@ -356,9 +351,7 @@ class _PayCoinsPageState extends State child: Image.asset( width: 16, height: 28, - index == 0 - ? 'assets/images/paycoins/ic_left_disable.png' - : 'assets/images/paycoins/ic_left.png', + index == 0 ? Assets.leftDisable : Assets.left, cacheWidth: 16.cacheSize(context), ), ), @@ -381,9 +374,7 @@ class _PayCoinsPageState extends State child: Image.asset( width: 16, height: 28, - index == 1 - ? 'assets/images/paycoins/ic_right_disable.png' - : 'assets/images/paycoins/ic_right.png', + index == 1 ? Assets.rightDisable : Assets.right, cacheWidth: 16.cacheSize(context), ), ), @@ -458,7 +449,7 @@ class _PayCoinsPageState extends State width: 30, height: 30, child: Image.asset( - 'assets/images/paycoins/ic_panel_close.png', + Assets.panelClose, width: 30, height: 30, cacheWidth: 30.cacheSize(context), diff --git a/lib/pages/video/reply/view.dart b/lib/pages/video/reply/view.dart index 6f971b225..b74d8eedb 100644 --- a/lib/pages/video/reply/view.dart +++ b/lib/pages/video/reply/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_reply.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart'; @@ -103,7 +103,7 @@ class _VideoReplyPanelState extends State ), ), TextButton.icon( - style: StyleString.buttonStyle, + style: Style.buttonStyle, onPressed: _videoReplyController.queryBySort, icon: Icon( Icons.sort, diff --git a/lib/pages/video/reply/widgets/reply_item_grpc.dart b/lib/pages/video/reply/widgets/reply_item_grpc.dart index bcfcdd304..bba134983 100644 --- a/lib/pages/video/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/reply/widgets/reply_item_grpc.dart @@ -1,6 +1,8 @@ import 'dart:math'; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/dialog/report.dart'; import 'package:PiliPlus/common/widgets/flutter/text/text.dart' as custom_text; @@ -15,11 +17,13 @@ import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/pages/dynamics/widgets/vote.dart'; +import 'package:PiliPlus/pages/member/widget/medal_widget.dart'; import 'package:PiliPlus/pages/save_panel/view.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/reply/widgets/zan_grpc.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; +import 'package:PiliPlus/utils/danmaku_utils.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; @@ -98,174 +102,189 @@ class ReplyItemGrpc extends StatelessWidget { }, ); - return Material( - type: MaterialType.transparency, - child: InkWell( - onTap: () => replyReply?.call(replyItem, null), - onLongPress: showMore, - onSecondaryTap: PlatformUtils.isMobile ? null : showMore, - child: _buildContent(context, theme), - ), - ); - } - - Widget _buildContent(BuildContext context, ThemeData theme) { Widget child = Padding( padding: const .fromLTRB(12, 14, 8, 5), - child: content(context, theme), + child: _buildContent(context, theme), ); - const double top = 8.0; - const double right = 12.0; - const double height = 38.0; - if (PendantAvatar.showDynDecorate && replyItem.member.hasGarbCardImage()) { - child = Stack( - clipBehavior: .none, + if (needDivider) { + child = Column( + mainAxisSize: .min, children: [ child, - Positioned( - top: top, - right: right, - height: height, - child: CachedNetworkImage( - height: height, - memCacheHeight: height.cacheSize(context), - imageUrl: ImageUtils.safeThumbnailUrl( - replyItem.member.garbCardImage, - ), - placeholder: (_, _) => const SizedBox.shrink(), - ), - ), - if (replyItem.member.hasGarbCardNumber()) - Positioned( - top: top, - right: right, - height: height, - child: Center( - child: Text( - 'NO.\n${replyItem.member.garbCardNumber}', - style: TextStyle( - fontSize: 8, - fontFamily: 'digital_id_num', - color: replyItem.member.garbCardFanColor.startsWith('#') - ? Utils.parseColor(replyItem.member.garbCardFanColor) - : null, - ), - ), - ), - ), - ], - ); - } - return Column( - crossAxisAlignment: .stretch, - children: [ - child, - if (needDivider) Divider( indent: 55, endIndent: 15, height: 0.3, color: theme.colorScheme.outline.withValues(alpha: 0.08), ), - ], + ], + ); + } + return Material( + type: MaterialType.transparency, + child: InkWell( + onTap: () => replyReply?.call(replyItem, null), + onLongPress: showMore, + onSecondaryTap: PlatformUtils.isMobile ? null : showMore, + child: child, + ), ); } - Widget content(BuildContext context, ThemeData theme) { - final padding = EdgeInsets.only(left: replyLevel == 0 ? 6 : 45, right: 6); - return Column( - mainAxisSize: .min, - crossAxisAlignment: .start, - children: [ - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - feedBack(); - Get.toNamed('/member?mid=${replyItem.mid}'); - }, - child: Row( - mainAxisSize: .min, - crossAxisAlignment: .center, - spacing: 12, - children: [ - PendantAvatar( - avatar: replyItem.member.face, - size: 34, - badgeSize: 14, - isVip: replyItem.member.vipStatus > 0, - officialType: replyItem.member.officialVerifyType.toInt(), - garbPendantImage: replyItem.member.hasGarbPendantImage() - ? replyItem.member.garbPendantImage - : null, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Row( - mainAxisSize: MainAxisSize.min, - spacing: 6, - children: [ - Text( - replyItem.member.name, + Widget _buildHeader(BuildContext context, ThemeData theme) { + final member = replyItem.member; + Widget header = GestureDetector( + onTap: () { + feedBack(); + Get.toNamed('/member?mid=${replyItem.mid}'); + }, + child: Row( + crossAxisAlignment: .center, + spacing: 12, + children: [ + PendantAvatar( + member.face, + size: 34, + badgeSize: 14, + vipStatus: member.vipStatus.toInt(), + officialType: member.officialVerifyType.toInt(), + pendantImage: member.hasGarbPendantImage() + ? member.garbPendantImage + : null, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + spacing: 6, + children: [ + Flexible( + child: Text( + member.name, + maxLines: 1, + overflow: .ellipsis, style: TextStyle( - color: - (replyItem.member.vipStatus > 0 && - replyItem.member.vipType == 2) + color: (member.vipStatus > 0 && member.vipType == 2) ? theme.colorScheme.vipColor : theme.colorScheme.outline, fontSize: 13, ), ), - Image.asset( - Utils.levelName( - replyItem.member.level, - isSeniorMember: replyItem.member.isSeniorMember == 1, - ), - height: 11, - cacheHeight: 11.cacheSize(context), + ), + Image.asset( + Utils.levelName( + member.level, + isSeniorMember: member.isSeniorMember == 1, ), - if (replyItem.mid == upMid) - const PBadge( - text: 'UP', - size: PBadgeSize.small, - isStack: false, - fontSize: 9, + height: 11, + cacheHeight: 11.cacheSize(context), + ), + if (replyItem.mid == upMid) + const PBadge( + text: 'UP', + size: PBadgeSize.small, + isStack: false, + fontSize: 9, + ) + else if (member.hasFansMedalLevel()) + MedalWidget( + medalName: member.fansMedalName, + level: member.fansMedalLevel.toInt(), + backgroundColor: DmUtils.decimalToColor( + member.fansMedalColor.toInt(), ), - ], - ), - Row( - mainAxisSize: MainAxisSize.min, - children: [ + nameColor: DmUtils.decimalToColor( + member.fansMedalColorName.toInt(), + ), + padding: const .symmetric(horizontal: 6, vertical: 1.5), + ), + ], + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + replyLevel == 0 + ? DateFormatUtils.format( + replyItem.ctime.toInt(), + format: DateFormatUtils.longFormatDs, + ) + : DateFormatUtils.dateFormat(replyItem.ctime.toInt()), + style: TextStyle( + fontSize: theme.textTheme.labelSmall!.fontSize, + color: theme.colorScheme.outline, + ), + ), + if (replyItem.replyControl.hasLocation()) Text( - replyLevel == 0 - ? DateFormatUtils.format( - replyItem.ctime.toInt(), - format: DateFormatUtils.longFormatDs, - ) - : DateFormatUtils.dateFormat( - replyItem.ctime.toInt(), - ), + ' • ${replyItem.replyControl.location}', style: TextStyle( fontSize: theme.textTheme.labelSmall!.fontSize, color: theme.colorScheme.outline, ), ), - if (replyItem.replyControl.hasLocation()) - Text( - ' • ${replyItem.replyControl.location}', - style: TextStyle( - fontSize: theme.textTheme.labelSmall!.fontSize, - color: theme.colorScheme.outline, - ), - ), - ], - ), - ], - ), - ], + ], + ), + ], + ), ), - ), + ], + ), + ); + if (PendantAvatar.showDynDecorate) { + final garb = replyItem.memberV2.garb; + if (garb.hasCardImage()) { + const double height = 38.0; + return Stack( + clipBehavior: .none, + children: [ + Positioned( + top: 0, + right: 0, + height: height, + child: CachedNetworkImage( + height: height, + memCacheHeight: height.cacheSize(context), + imageUrl: ImageUtils.safeThumbnailUrl(garb.cardImage), + placeholder: (_, _) => const SizedBox.shrink(), + ), + ), + if (garb.hasCardNumber()) + Positioned( + top: 0, + right: 0, + height: height, + child: Center( + child: Text( + '${garb.fanNumPrefix}\n${garb.cardNumber}', + style: TextStyle( + fontSize: 8, + fontFamily: Assets.digitalNum, + color: Utils.parseColor(garb.cardFanColor), + ), + ), + ), + ), + Padding( + padding: const .only(right: 80), + child: header, + ), + ], + ); + } + } + return header; + } + + Widget _buildContent(BuildContext context, ThemeData theme) { + final padding = EdgeInsets.only(left: replyLevel == 0 ? 6 : 45, right: 6); + return Column( + mainAxisSize: .min, + crossAxisAlignment: .start, + children: [ + _buildHeader(context, theme), const SizedBox(height: 10), Padding( padding: padding, @@ -292,7 +311,7 @@ class ReplyItemGrpc extends StatelessWidget { ), const TextSpan(text: ' '), ], - buildContent(context, theme, replyItem), + _buildMessage(context, theme, replyItem), ], ), ), @@ -345,7 +364,7 @@ class ReplyItemGrpc extends StatelessWidget { visualDensity: VisualDensity.compact, ); return Row( - children: [ + children: [ const SizedBox(width: 36), SizedBox( height: 32, @@ -506,7 +525,7 @@ class ReplyItemGrpc extends StatelessWidget { ? '' : ' ', ), - buildContent(context, theme, childReply), + _buildMessage(context, theme, childReply), ], ), ), @@ -552,7 +571,7 @@ class ReplyItemGrpc extends StatelessWidget { ); } - InlineSpan buildContent( + InlineSpan _buildMessage( BuildContext context, ThemeData theme, ReplyInfo replyItem, @@ -852,7 +871,7 @@ class ReplyItemGrpc extends StatelessWidget { children: [ InkWell( onTap: Get.back, - borderRadius: StyleString.bottomSheetRadius, + borderRadius: Style.bottomSheetRadius, child: SizedBox( height: 35, child: Center( @@ -876,7 +895,6 @@ class ReplyItemGrpc extends StatelessWidget { (item.deepCopy() ..unknownFields.clear() ..replies.clear() - ..clearMemberV2() ..clearTrackInfo()) .writeToBuffer(), ); @@ -905,7 +923,6 @@ class ReplyItemGrpc extends StatelessWidget { (item.deepCopy() ..unknownFields.clear() ..replies.clear() - ..clearMemberV2() ..clearTrackInfo()) .writeToBuffer(); GStorage.reply!.putAll({ @@ -945,7 +962,7 @@ class ReplyItemGrpc extends StatelessWidget { ], ), ), - actions: [ + actions: [ TextButton( onPressed: () => Get.back(result: false), child: Text( diff --git a/lib/pages/video/reply_reply/view.dart b/lib/pages/video/reply_reply/view.dart index e73dc14dd..b5f368733 100644 --- a/lib/pages/video/reply_reply/view.dart +++ b/lib/pages/video/reply_reply/view.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_reply.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/colored_box_transition.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; @@ -260,7 +260,7 @@ class _VideoReplyReplyPanelState extends State }, ), TextButton.icon( - style: StyleString.buttonStyle, + style: Style.buttonStyle, onPressed: _controller.queryBySort, icon: Icon( Icons.sort, diff --git a/lib/pages/video/reply_search_item/child/widgets/item.dart b/lib/pages/video/reply_search_item/child/widgets/item.dart index ceac7bada..ae6ac2fdd 100644 --- a/lib/pages/video/reply_search_item/child/widgets/item.dart +++ b/lib/pages/video/reply_search_item/child/widgets/item.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; @@ -61,14 +61,14 @@ class ReplySearchItem extends StatelessWidget { onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ AspectRatio( - aspectRatio: StyleString.aspectRatio, + aspectRatio: Style.aspectRatio, child: LayoutBuilder( builder: (context, boxConstraints) { return Stack( diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index dbf5b9eec..1a158528e 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -3,7 +3,8 @@ import 'dart:io'; import 'dart:math'; import 'dart:ui'; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/common/widgets/flutter/pop_scope.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -473,7 +474,7 @@ class _VideoDetailPageVState extends State maxHeight = size.height; final shortestSide = size.shortestSide; - final minVideoHeight = shortestSide / StyleString.aspectRatio16x9; + final minVideoHeight = shortestSide / Style.aspectRatio16x9; final maxVideoHeight = max(size.longestSide * 0.65, shortestSide); videoDetailController ..isPortrait = isPortrait = maxHeight >= maxWidth @@ -948,7 +949,7 @@ class _VideoDetailPageVState extends State enableVerticalExpand && !isPortrait) { final double videoHeight = maxHeight - padding.vertical; - final double width = videoHeight / StyleString.aspectRatio16x9; + final double width = videoHeight / Style.aspectRatio16x9; final videoWidth = isFullScreen ? maxWidth : width; final introWidth = (maxWidth - padding.horizontal - width) / 2; final introHeight = maxHeight - padding.top; @@ -1010,10 +1011,10 @@ class _VideoDetailPageVState extends State width = maxWidth - clampDouble(maxWidth - width, 280, 425); } final videoWidth = isFullScreen ? maxWidth : width; - final double height = width / StyleString.aspectRatio16x9; + final double height = width / Style.aspectRatio16x9; final videoHeight = isFullScreen ? maxHeight - padding.top : height; if (height > maxHeight) { - return childSplit(StyleString.aspectRatio16x9); + return childSplit(Style.aspectRatio16x9); } final introHeight = maxHeight - height - padding.top; final showIntro = @@ -1268,7 +1269,7 @@ class _VideoDetailPageVState extends State tooltip: '播放', onPressed: handlePlay, icon: Image.asset( - 'assets/images/play.png', + Assets.play, width: 60, height: 60, cacheHeight: 60.cacheSize(context), @@ -1391,7 +1392,7 @@ class _VideoDetailPageVState extends State child = childWhenDisabled; } else if (maxWidth / maxHeight >= kScreenRatio) { child = childWhenDisabledLandscape; - } else if (maxWidth / StyleString.aspectRatio16x9 < 0.4 * maxHeight) { + } else if (maxWidth / Style.aspectRatio16x9 < 0.4 * maxHeight) { child = childWhenDisabled; } else { child = childWhenDisabledAlmostSquare; @@ -1595,7 +1596,7 @@ class _VideoDetailPageVState extends State height: height, cacheWidth: true, getPlaceHolder: () => Center( - child: Image.asset('assets/images/loading.png'), + child: Image.asset(Assets.loading), ), ), ), @@ -1788,7 +1789,7 @@ class _VideoDetailPageVState extends State SliverToBoxAdapter( child: Padding( padding: const EdgeInsets.only( - top: StyleString.safeSpace, + top: Style.safeSpace, ), child: Divider( height: 1, @@ -1817,7 +1818,7 @@ class _VideoDetailPageVState extends State height: (videoDetailController.isPlayAll && !isPortrait ? 80 - : StyleString.safeSpace) + + : Style.safeSpace) + padding.bottom, ), ), diff --git a/lib/pages/video/view_point/view.dart b/lib/pages/video/view_point/view.dart index d5d65fc5e..26d54a555 100644 --- a/lib/pages/video/view_point/view.dart +++ b/lib/pages/video/view_point/view.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart'; @@ -138,7 +138,7 @@ class _ViewPointsPageState extends State : null, child: Padding( padding: const EdgeInsets.symmetric( - horizontal: StyleString.safeSpace, + horizontal: Style.safeSpace, vertical: 5, ), child: Row( diff --git a/lib/pages/webdav/view.dart b/lib/pages/webdav/view.dart index c9d16360b..f71cf6c37 100644 --- a/lib/pages/webdav/view.dart +++ b/lib/pages/webdav/view.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/pages/webdav/webdav.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; @@ -98,7 +98,7 @@ class _WebDavSettingPageState extends State { child: FilledButton.tonal( style: FilledButton.styleFrom( shape: const RoundedRectangleBorder( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, ), ), onPressed: WebDav().backup, @@ -110,7 +110,7 @@ class _WebDavSettingPageState extends State { child: FilledButton.tonal( style: FilledButton.styleFrom( shape: const RoundedRectangleBorder( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, ), ), onPressed: WebDav().restore, diff --git a/lib/pages/whisper/widgets/item.dart b/lib/pages/whisper/widgets/item.dart index e22e101bd..687bef3f2 100644 --- a/lib/pages/whisper/widgets/item.dart +++ b/lib/pages/whisper/widgets/item.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/flutter/list_tile.dart'; @@ -184,6 +185,25 @@ class WhisperSessionItem extends StatelessWidget { } else { SmartDialog.showToast(item.id.foldId.type.name); } + return; + } + + if (item.id.hasSystemId()) { + switch (item.id.systemId.type) { + case SessionType.SESSION_TYPE_SYSTEM: + Get.toNamed('/sysMsg'); + case SessionType.SESSION_TYPE_AI_FOLD: + case SessionType.SESSION_TYPE_CUSTOMER_ACCOUNT: + case SessionType.SESSION_TYPE_CUSTOMER_FOLD: + case SessionType.SESSION_TYPE_DUSTBIN: + case SessionType.SESSION_TYPE_GROUP: + case SessionType.SESSION_TYPE_GROUP_FOLD: + case SessionType.SESSION_TYPE_PRIVATE: + case SessionType.SESSION_TYPE_STRANGER: + case SessionType.SESSION_TYPE_UNFOLLOWED: + case SessionType.SESSION_TYPE_UNKNOWN: + SmartDialog.showToast(item.id.systemId.type.name); + } } }, leading: Builder( @@ -207,14 +227,13 @@ class WhisperSessionItem extends StatelessWidget { Get.toNamed('/member?mid=${item.sessionInfo.avatar.mid}') : null, child: PendantAvatar( + avatar, size: 42, badgeSize: 14, - avatar: avatar, - garbPendantImage: - pendant?.resImage.imageSrc.remote.hasUrl() == true + pendantImage: pendant?.resImage.imageSrc.remote.hasUrl() == true ? pendant!.resImage.imageSrc.remote.url : pendant?.resAnimation.webpSrc.remote.url, - isVip: vipInfo?['status'] != null && vipInfo!['status'] > 0, + vipStatus: vipInfo?['status'], officialType: official?.hasLocalValue() == true ? switch (official!.localValue) { 3 => 0, @@ -260,7 +279,7 @@ class WhisperSessionItem extends StatelessWidget { ), if (item.sessionInfo.isLive) Image.asset( - 'assets/images/live/live.gif', + Assets.livingRect, height: 15, cacheHeight: 15.cacheSize(context), filterQuality: FilterQuality.low, diff --git a/lib/pages/whisper_detail/view.dart b/lib/pages/whisper_detail/view.dart index d04c55196..9962334d8 100644 --- a/lib/pages/whisper_detail/view.dart +++ b/lib/pages/whisper_detail/view.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:io' show File; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/widgets/dialog/report.dart'; import 'package:PiliPlus/common/widgets/flutter/chat_list_view.dart'; import 'package:PiliPlus/common/widgets/flutter/text_field/text_field.dart'; @@ -92,7 +93,7 @@ class _WhisperDetailPageState if (_whisperDetailController.isLive) ...[ const SizedBox(width: 10), Image.asset( - 'assets/images/live/live.gif', + Assets.livingRect, height: 16, cacheHeight: 16.cacheSize(context), filterQuality: FilterQuality.low, diff --git a/lib/pages/whisper_detail/widget/chat_item.dart b/lib/pages/whisper_detail/widget/chat_item.dart index 2fcfeb748..3ca6b7442 100644 --- a/lib/pages/whisper_detail/widget/chat_item.dart +++ b/lib/pages/whisper_detail/widget/chat_item.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:math' as math; import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart'; @@ -408,7 +409,7 @@ class ChatItem extends StatelessWidget { clipBehavior: Clip.hardEdge, constraints: const BoxConstraints(maxWidth: 400.0), decoration: BoxDecoration( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, color: theme.colorScheme.onInverseSurface, ), child: LayoutBuilder( @@ -442,8 +443,7 @@ class ChatItem extends StatelessWidget { NetworkImgLayer( type: ImageType.emote, width: constrains.maxWidth, - height: - constrains.maxWidth / StyleString.aspectRatio16x9, + height: constrains.maxWidth / Style.aspectRatio16x9, src: content['cover'], ), PBadge( @@ -620,7 +620,7 @@ class ChatItem extends StatelessWidget { height: width * ratio, src: url, ); - if (ratio <= StyleString.imgMaxRatio) { + if (ratio <= Style.imgMaxRatio) { child = fromHero( tag: url, child: child, @@ -781,7 +781,7 @@ class ChatItem extends StatelessWidget { builder: (context, constraints) { final maxWidth = math.max(400.0, constraints.maxWidth); Widget child = ClipRRect( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, child: CachedNetworkImage( width: maxWidth, memCacheWidth: maxWidth.cacheSize(context), diff --git a/lib/pages/whisper_link_setting/view.dart b/lib/pages/whisper_link_setting/view.dart index 5696f4d6d..a85f2a550 100644 --- a/lib/pages/whisper_link_setting/view.dart +++ b/lib/pages/whisper_link_setting/view.dart @@ -125,12 +125,11 @@ class _WhisperLinkSettingPageState extends State { return ListTile( onTap: () => Get.toNamed('/member?mid=${item.mid}'), leading: PendantAvatar( - avatar: item.face, + item.face, size: 42, badgeSize: 14, - isVip: - item.vip?.status != null && item.vip!.status > 0, - garbPendantImage: item.pendant?.image, + vipStatus: item.vip?.status, + pendantImage: item.pendant?.image, officialType: item.official?.type, ), title: Text( diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 42d6ce04f..ef7928c8d 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -4,7 +4,7 @@ import 'dart:io' show Platform; import 'dart:math' show max, min; import 'dart:ui' as ui; -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/http/browser_ua.dart'; import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -654,7 +654,7 @@ class PlPlayerController with BlockConfigMixin { return shadersDirPath = await AssetUtils.getOrCopy( 'assets/shaders', - Constants.mpvAnime4KShaders.followedBy(Constants.mpvAnime4KShadersLite), + Assets.mpvAnime4KShaders.followedBy(Assets.mpvAnime4KShadersLite), path.join(appSupportDirPath, 'anime_shaders'), ); } @@ -682,7 +682,7 @@ class PlPlayerController with BlockConfigMixin { 'set', PathUtils.buildShadersAbsolutePath( await copyShadersToExternalDirectory, - Constants.mpvAnime4KShadersLite, + Assets.mpvAnime4KShadersLite, ), ]); case SuperResolutionType.quality: @@ -692,7 +692,7 @@ class PlPlayerController with BlockConfigMixin { 'set', PathUtils.buildShadersAbsolutePath( await copyShadersToExternalDirectory, - Constants.mpvAnime4KShaders, + Assets.mpvAnime4KShaders, ), ]); } diff --git a/lib/plugin/pl_player/models/video_fit_type.dart b/lib/plugin/pl_player/models/video_fit_type.dart index 67938c72d..96b922dd6 100644 --- a/lib/plugin/pl_player/models/video_fit_type.dart +++ b/lib/plugin/pl_player/models/video_fit_type.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:flutter/material.dart' show BoxFit; enum VideoFitType { @@ -10,7 +10,7 @@ enum VideoFitType { none('原始', boxFit: BoxFit.none), scaleDown('限制', boxFit: BoxFit.scaleDown), ratio_4x3('4:3', aspectRatio: 4 / 3), - ratio_16x9('16:9', aspectRatio: StyleString.aspectRatio16x9) + ratio_16x9('16:9', aspectRatio: Style.aspectRatio16x9) ; final String desc; diff --git a/lib/plugin/pl_player/view/view.dart b/lib/plugin/pl_player/view/view.dart index 2ce32bdf9..547e7d8a7 100644 --- a/lib/plugin/pl_player/view/view.dart +++ b/lib/plugin/pl_player/view/view.dart @@ -3,7 +3,9 @@ import 'dart:io'; import 'dart:math' as math; import 'dart:ui' as ui; +import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/cropped_image.dart'; import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/common/widgets/disabled_icon.dart'; @@ -1916,7 +1918,7 @@ class _PLVideoPlayerState extends State mainAxisSize: MainAxisSize.min, children: [ Image.asset( - 'assets/images/loading.webp', + Assets.buffering, height: 25, cacheHeight: 25.cacheSize(context), semanticLabel: "加载中", diff --git a/lib/plugin/pl_player/view/widgets.dart b/lib/plugin/pl_player/view/widgets.dart index 38c9c04ff..d1227d719 100644 --- a/lib/plugin/pl_player/view/widgets.dart +++ b/lib/plugin/pl_player/view/widgets.dart @@ -98,7 +98,7 @@ Widget buildSeekPreviewWidget( final url = data.image[pageIndex]; return ClipRRect( - borderRadius: StyleString.mdRadius, + borderRadius: Style.mdRadius, child: VideoShotImage( url: url, x: x, diff --git a/lib/utils/grid.dart b/lib/utils/grid.dart index b41caa482..30f178afd 100644 --- a/lib/utils/grid.dart +++ b/lib/utils/grid.dart @@ -1,7 +1,7 @@ import 'dart:math'; -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_h.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -25,7 +25,7 @@ abstract final class Grid { }) => SliverGridDelegateWithExtentAndRatio( mainAxisSpacing: 2, maxCrossAxisExtent: Grid.smallCardWidth * 2, - childAspectRatio: StyleString.aspectRatio * 2.2, + childAspectRatio: Style.aspectRatio * 2.2, minHeight: MediaQuery.textScalerOf(context).scale(minHeight), ); } diff --git a/lib/utils/theme_utils.dart b/lib/utils/theme_utils.dart index 1715f566b..f1c76b1be 100644 --- a/lib/utils/theme_utils.dart +++ b/lib/utils/theme_utils.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/main.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; @@ -96,7 +96,7 @@ abstract final class ThemeUtils { bottomSheetTheme: BottomSheetThemeData( backgroundColor: colorScheme.surface, shape: const RoundedRectangleBorder( - borderRadius: StyleString.bottomSheetRadius, + borderRadius: Style.bottomSheetRadius, ), ), // ignore: deprecated_member_use diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 2e4aac881..cb455a9db 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -81,7 +81,7 @@ abstract final class Utils { } static Color parseColor(String color) => - Color(int.parse(color.replaceFirst('#', 'FF'), radix: 16)); + Color(int.parse('FF${color.substring(1)}', radix: 16)); static Color parseMedalColor(String color) => Color( int.parse('${color.substring(7)}${color.substring(1, 7)}', radix: 16), diff --git a/lib/utils/waterfall.dart b/lib/utils/waterfall.dart index 78ad40ce2..55fde4762 100644 --- a/lib/utils/waterfall.dart +++ b/lib/utils/waterfall.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/dynamic_card.dart'; +import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/flutter/sliver_layout_builder.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/grid.dart'; @@ -38,7 +38,7 @@ mixin DynMixin { crossAxisSpacing: 4, mainAxisSpacing: 4, maxCrossAxisExtent: Grid.smallCardWidth * 2, - childAspectRatio: StyleString.aspectRatio, + childAspectRatio: Style.aspectRatio, mainAxisExtent: 50, );