From 6d789c7b1936bed9ede1d3da8b5bb6f0e1f36a73 Mon Sep 17 00:00:00 2001 From: peima Date: Sun, 26 Jul 2026 01:10:45 +0800 Subject: [PATCH] phase3: badges 2.x->3.x migration (badgeStyle/animation), SearchBar/onPrimary fixes. 596->580 --- lib/widgets/desktop/desktop_search_place.dart | 2 +- .../desktop/desktop_store_product_search.dart | 2 +- lib/widgets/desktop/product_search.dart | 2 +- lib/widgets/desktop/shop_products.dart | 2 +- lib/widgets/general/add_remove_button.dart | 5 +- lib/widgets/mobile/mobile_search_place.dart | 2 +- .../mobile/mobile_store_product_search.dart | 2 +- lib/widgets/mobile/product_search.dart | 2 +- lib/widgets/mobile/shop.dart | 4 +- tools/badge_migrate.py | 80 +++++++++++++++++++ 10 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 tools/badge_migrate.py diff --git a/lib/widgets/desktop/desktop_search_place.dart b/lib/widgets/desktop/desktop_search_place.dart index 3d61e80..b75e4ef 100644 --- a/lib/widgets/desktop/desktop_search_place.dart +++ b/lib/widgets/desktop/desktop_search_place.dart @@ -1,7 +1,7 @@ import 'package:dio/dio.dart'; import '../general/search_bar.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' hide SearchBar; import 'package:flutter_wisetronic/widgets/general/breadcrumbs.dart'; import 'package:flutter_wisetronic/widgets/general/navigationbar.dart'; diff --git a/lib/widgets/desktop/desktop_store_product_search.dart b/lib/widgets/desktop/desktop_store_product_search.dart index 2c6f0a0..34e5255 100644 --- a/lib/widgets/desktop/desktop_store_product_search.dart +++ b/lib/widgets/desktop/desktop_store_product_search.dart @@ -1,7 +1,7 @@ import 'package:dio/dio.dart'; import '../general/search_bar.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' hide SearchBar; import 'package:flutter/rendering.dart'; import 'package:flutter_wisetronic/pages/product_detail_page.dart'; import 'package:flutter_wisetronic/widgets/desktop/desktop_product_item.dart'; diff --git a/lib/widgets/desktop/product_search.dart b/lib/widgets/desktop/product_search.dart index da06e80..2c803ae 100644 --- a/lib/widgets/desktop/product_search.dart +++ b/lib/widgets/desktop/product_search.dart @@ -1,7 +1,7 @@ import 'package:dio/dio.dart'; import '../general/search_bar.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' hide SearchBar; import '../../constants.dart'; import '../../events/eventbus.dart'; diff --git a/lib/widgets/desktop/shop_products.dart b/lib/widgets/desktop/shop_products.dart index fe626ed..1af5140 100644 --- a/lib/widgets/desktop/shop_products.dart +++ b/lib/widgets/desktop/shop_products.dart @@ -165,7 +165,7 @@ class ShopProductsState extends State { fontSize: 11.0, ), ), - animationType: BadgeAnimationType.scale, + animation: BadgeAnimation.scale(), ), ); } else { diff --git a/lib/widgets/general/add_remove_button.dart b/lib/widgets/general/add_remove_button.dart index e157e30..27e486a 100644 --- a/lib/widgets/general/add_remove_button.dart +++ b/lib/widgets/general/add_remove_button.dart @@ -120,13 +120,12 @@ class AddRemoveButtonState extends State { fontSize: 17.0, ), ), - padding: EdgeInsets.all(10), position: BadgePosition.topEnd(top: -15, end: -10), - badgeColor: Colors.lightBlueAccent, + badgeStyle: BadgeStyle(badgeColor: Colors.lightBlueAccent, padding: EdgeInsets.all(10)), child: ElevatedButton.icon( style: ElevatedButton.styleFrom( backgroundColor: Colors.redAccent, - onPrimary: Colors.white, + foregroundColor: Colors.white, padding: EdgeInsets.only(left: 32, right: 32, top: 20, bottom: 20), elevation: 2.0, shape: new RoundedRectangleBorder( diff --git a/lib/widgets/mobile/mobile_search_place.dart b/lib/widgets/mobile/mobile_search_place.dart index 0c53c50..e036ca1 100644 --- a/lib/widgets/mobile/mobile_search_place.dart +++ b/lib/widgets/mobile/mobile_search_place.dart @@ -1,7 +1,7 @@ import 'package:dio/dio.dart'; import '../general/search_bar.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' hide SearchBar; import '../../events/eventbus.dart'; import '../../events/events.dart'; diff --git a/lib/widgets/mobile/mobile_store_product_search.dart b/lib/widgets/mobile/mobile_store_product_search.dart index 55dc690..c1e1fd3 100644 --- a/lib/widgets/mobile/mobile_store_product_search.dart +++ b/lib/widgets/mobile/mobile_store_product_search.dart @@ -1,7 +1,7 @@ import 'package:dio/dio.dart'; import '../general/search_bar.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' hide SearchBar; import '../../events/eventbus.dart'; import '../../events/events.dart'; diff --git a/lib/widgets/mobile/product_search.dart b/lib/widgets/mobile/product_search.dart index 211bc33..e0526ee 100644 --- a/lib/widgets/mobile/product_search.dart +++ b/lib/widgets/mobile/product_search.dart @@ -1,7 +1,7 @@ import 'package:dio/dio.dart'; import '../general/search_bar.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' hide SearchBar; import '../../events/eventbus.dart'; import '../../events/events.dart'; diff --git a/lib/widgets/mobile/shop.dart b/lib/widgets/mobile/shop.dart index 00b8112..f3e3c68 100644 --- a/lib/widgets/mobile/shop.dart +++ b/lib/widgets/mobile/shop.dart @@ -449,7 +449,7 @@ class ShopState extends State '${_business.commentsCount}', style: TextStyle(color: Colors.white, fontSize: 11.0), ), - badgeColor: Colors.lightBlueAccent, + badgeStyle: BadgeStyle(badgeColor: Colors.lightBlueAccent), child: Text(S.of(context).comments), ), ), @@ -1188,7 +1188,7 @@ class ShopState extends State fontSize: 11.0, ), ), - animationType: BadgeAnimationType.scale, + animation: BadgeAnimation.scale(), ), ); } else { diff --git a/tools/badge_migrate.py b/tools/badge_migrate.py new file mode 100644 index 0000000..2d52a57 --- /dev/null +++ b/tools/badge_migrate.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +"""badge_migrate.py — 把 badges 2.x 用法迁移到 3.x。 +- animationType: BadgeAnimationType.X -> animation: BadgeAnimation.X() +- Badge(... badgeColor: C, padding: P ...) -> Badge(... badgeStyle: BadgeStyle(badgeColor: C, padding: P) ...) +""" +import re, glob + +def find_calls(text, name): + calls=[] + for m in re.finditer(r'\b'+name+r'\s*\(', text): + if m.start()>0 and (text[m.start()-1].isalnum() or text[m.start()-1]=='_'): + continue # 跳过 BadgeStyle/BadgeAnimation 等同名前缀 + i=m.end()-1; depth=0; j=i + while j animation: BadgeAnimation.X() + t=re.sub(r'animationType:\s*BadgeAnimationType\.(\w+)', r'animation: BadgeAnimation.\1()', t) + # 2) 合并 badgeColor + padding -> badgeStyle(从后往前处理避免偏移) + while True: + calls=find_calls(t, 'Badge') + did=False + for s,e,inner in reversed(calls): + bc,_,_=extract_param(inner,'badgeColor') + pd,_,_=extract_param(inner,'padding') + if not (bc or pd): continue + new_inner=inner + parts=[] + if bc: + v,vs,ve=extract_param(new_inner,'badgeColor') + # 删除该参数(含尾随逗号) + seg=new_inner[vs:ve] + after=new_inner[ve:] + if after.lstrip().startswith(','): after=after.lstrip()[1:] + new_inner=new_inner[:vs]+after + parts.append('badgeColor: '+bc) + if pd: + v,vs,ve=extract_param(new_inner,'padding') + seg=new_inner[vs:ve] + after=new_inner[ve:] + if after.lstrip().startswith(','): after=after.lstrip()[1:] + new_inner=new_inner[:vs]+after + parts.append('padding: '+pd) + badge_style='\n badgeStyle: BadgeStyle('+', '.join(parts)+'),' + new_inner=badge_style+new_inner + t=t[:s]+'Badge('+new_inner+')'+t[e+1:] + did=True; break + if not did: break + if t!=orig: + open(path,'w').write(t); changed_files+=1; print('migrated', path) +print('done, files:', changed_files)