feat: 广告服务抽象(Mock 激励视频)+ url_launcher 依赖

This commit is contained in:
2026-07-31 13:47:11 +08:00
parent 13c7a73230
commit ef42602c7c
5 changed files with 138 additions and 0 deletions
+24
View File
@@ -0,0 +1,24 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
/// 广告服务抽象:P0 用 Mock(保证业务链路可开发可测),P1 换穿山甲 SDK
abstract class AdsService {
bool get enabled;
Future<bool> showRewarded();
}
/// 本地模拟激励视频(约 1 秒"播放"后返回完整观看)
class MockAdsService implements AdsService {
@override
bool get enabled => true;
@override
Future<bool> showRewarded() async {
await Future.delayed(const Duration(milliseconds: 900));
return true;
}
}
final adsServiceProvider = Provider<AdsService>((ref) {
// P1AppConfig.pangleAppId 非空时替换为 PangleAdsService(穿山甲 SDK 实现)
return MockAdsService();
});
+25
View File
@@ -0,0 +1,25 @@
/// 会员 providerTask 1 仅含权益文案纯函数(Task 2 将补全状态/套餐/下单/轮询/领奖)
class MemberInfo {
final bool isVip;
final String expireAt;
final String planName;
final List<String> benefits;
const MemberInfo({
required this.isVip,
required this.expireAt,
required this.planName,
required this.benefits,
});
}
/// 权益 key → 文案
const benefitLabels = {
'effect_unlimited': '无限效果图',
'ai_priority': '优先 AI 方案',
'cps_commission_x15': '返现加成 1.5x',
'store_discount': '门店折扣',
};
List<String> benefitTexts(MemberInfo m) =>
m.benefits.map((b) => benefitLabels[b] ?? b).toList();
+64
View File
@@ -717,6 +717,70 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.4.0"
url_launcher:
dependency: "direct main"
description:
name: url_launcher
sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8
url: "https://pub.dev"
source: hosted
version: "6.3.2"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: b413d49b73867ac08dd2f9890efd3cc11f2a0e577618d50843440a1fb3776c32
url: "https://pub.dev"
source: hosted
version: "6.3.32"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0"
url: "https://pub.dev"
source: hosted
version: "6.4.1"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a
url: "https://pub.dev"
source: hosted
version: "3.2.2"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18"
url: "https://pub.dev"
source: hosted
version: "3.2.5"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34"
url: "https://pub.dev"
source: hosted
version: "2.4.3"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f"
url: "https://pub.dev"
source: hosted
version: "3.1.5"
uuid:
dependency: transitive
description:
+1
View File
@@ -40,6 +40,7 @@ dependencies:
image_picker: ^1.2.3
shared_preferences: ^2.5.5
fluttertoast: ^9.1.0
url_launcher: ^6.3.0
# v2 3D 渲染接入时引入:three_dart ^0.0.16 + three_dart_jsm ^0.0.10 + flutter_gl ^0.0.20
# flutter_gl 0.0.21 在 Flutter 3.44 下无法编译:platformViewRegistry 已移除)
+24
View File
@@ -0,0 +1,24 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:slogan_app/features/member/member_provider.dart';
void main() {
test('benefitTexts 映射已知权益文案,未知 key 原样保留', () {
final info = MemberInfo(
isVip: true,
expireAt: '2026-08-30 12:00:00',
planName: '月卡',
benefits: const ['effect_unlimited', 'unknown_key'],
);
expect(benefitTexts(info), ['无限效果图', 'unknown_key']);
});
test('benefitTexts 空权益返回空列表', () {
final info = MemberInfo(
isVip: false,
expireAt: '',
planName: '',
benefits: const [],
);
expect(benefitTexts(info), isEmpty);
});
}