feat: 广告服务抽象(Mock 激励视频)+ url_launcher 依赖
This commit is contained in:
@@ -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) {
|
||||
// P1:AppConfig.pangleAppId 非空时替换为 PangleAdsService(穿山甲 SDK 实现)
|
||||
return MockAdsService();
|
||||
});
|
||||
@@ -0,0 +1,25 @@
|
||||
/// 会员 provider:Task 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();
|
||||
@@ -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:
|
||||
|
||||
@@ -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 已移除)
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user