Compare commits
2 Commits
1242f2b3fe
...
df6788bbcd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df6788bbcd | ||
|
|
40b4ae8948 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -41,6 +41,7 @@ pubspec.lock
|
||||
**/android/**/GeneratedPluginRegistrant.java
|
||||
|
||||
# iOS
|
||||
**/Pods/
|
||||
**/ios/**/*.mode1v3
|
||||
**/ios/**/*.mode2v3
|
||||
**/ios/**/*.moved-aside
|
||||
|
||||
@ -6,6 +6,8 @@ class PaymentMethodItem {
|
||||
this.name,
|
||||
this.icon,
|
||||
this.recommend = false,
|
||||
this.bonusCredits = 0,
|
||||
this.bonusRatio = 0,
|
||||
});
|
||||
|
||||
final String paymentMethod; // resource,如 GOOGLEPAY/APPLEPAY
|
||||
@ -13,6 +15,10 @@ class PaymentMethodItem {
|
||||
final String? name; // brigade 展示名称
|
||||
final String? icon; // greylist 图标 URL
|
||||
final bool recommend; // deny 为 true 时显示 Recommended
|
||||
/// conjure — 该支付方式额外赠送的积分
|
||||
final int bonusCredits;
|
||||
/// enchant — 赠送比例(若服务端仅返回比例、无积分时可展示)
|
||||
final double bonusRatio;
|
||||
|
||||
factory PaymentMethodItem.fromJson(Map<String, dynamic> json) {
|
||||
return PaymentMethodItem(
|
||||
@ -21,8 +27,38 @@ class PaymentMethodItem {
|
||||
name: json['brigade']?.toString(),
|
||||
icon: json['greylist']?.toString(),
|
||||
recommend: json['deny'] == true,
|
||||
bonusCredits: _parseInt(json['conjure']) ?? 0,
|
||||
bonusRatio: _parseDouble(json['enchant']) ?? 0,
|
||||
);
|
||||
}
|
||||
|
||||
static int? _parseInt(dynamic v) {
|
||||
if (v == null) return null;
|
||||
if (v is int) return v;
|
||||
if (v is num) return v.toInt();
|
||||
return int.tryParse(v.toString());
|
||||
}
|
||||
|
||||
static double? _parseDouble(dynamic v) {
|
||||
if (v == null) return null;
|
||||
if (v is double) return v;
|
||||
if (v is num) return v.toDouble();
|
||||
return double.tryParse(v.toString());
|
||||
}
|
||||
|
||||
String get displayName => name?.isNotEmpty == true ? name! : paymentMethod;
|
||||
|
||||
/// 用于列表副标题:优先展示赠送积分,否则展示赠送比例
|
||||
String? get bonusLabel {
|
||||
if (bonusCredits > 0) {
|
||||
return '+$bonusCredits bonus credits';
|
||||
}
|
||||
if (bonusRatio > 0) {
|
||||
final pct = bonusRatio <= 1
|
||||
? (bonusRatio * 100).round()
|
||||
: bonusRatio.round();
|
||||
return '+$pct% bonus credits';
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@ -787,7 +787,7 @@ class _PaymentMethodItem extends StatelessWidget {
|
||||
child: AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 150),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
|
||||
height: 64,
|
||||
constraints: const BoxConstraints(minHeight: 64),
|
||||
decoration: BoxDecoration(
|
||||
color: isSelected ? const Color(0x158B5CF6) : AppColors.surface,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
@ -804,7 +804,12 @@ class _PaymentMethodItem extends StatelessWidget {
|
||||
_PaymentIcon(iconUrl: item.icon),
|
||||
const SizedBox(width: 12),
|
||||
Expanded(
|
||||
child: Row(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Flexible(
|
||||
child: Text(
|
||||
@ -830,6 +835,21 @@ class _PaymentMethodItem extends StatelessWidget {
|
||||
],
|
||||
],
|
||||
),
|
||||
if (item.bonusLabel != null) ...[
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
item.bonusLabel!,
|
||||
style: AppTypography.caption.copyWith(
|
||||
color: AppColors.primary,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 12,
|
||||
),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user