tasco_module
Package tasco_module định nghĩa giao diện hợp đồng (Contract Interface) giữa Host Shell (SuperApp) và các module nghiệp vụ (Mini-apps). Đây là thành phần mấu chốt cho phép phát triển ứng dụng di động theo mô hình Modular độc lập.
1. Giao diện hợp đồng
ModuleSlot
Mỗi Mini-app cần kế thừa giao diện ModuleSlot để cung cấp siêu dữ liệu và khai báo các hook vòng đời cho Host Shell:
abstract class ModuleSlot {
// ID định danh duy nhất cho module (ví dụ: 'car_insurance')
String get moduleId;
// Đường dẫn tiền tố định tuyến của module (ví dụ: '/car')
String get routePrefix;
// Các loại tin nhắn FCM đẩy thông báo mà module này có khả năng xử lý
List<String> get notificationTypes;
// Khởi tạo tài nguyên nội bộ của module
Future<void> init({required AppEnv env, required Interceptor hostInterceptor});
// Trả về danh sách định tuyến (RouteBase) của module để gộp vào GoRouter chính
List<RouteBase> routes();
// Callback nhận xử lý khi có thông báo FCM thuộc notificationTypes
Future<void> onNotification(ModuleNotification notification);
// Giải phóng tài nguyên khi tắt ứng dụng
void dispose();
}
ModuleManager
Lớp quản lý trung tâm nằm ở phía Host Shell, chịu trách nhiệm lưu trữ và điều phối các khe cắm ModuleSlot:
register(ModuleSlot slot): Đăng ký một module.collectRoutes(): Gộp tất cả định tuyến của các module đã đăng ký thành một danh sách duy nhất.dispatchNotification(...): Phân phối thông báo đẩy đến đúng module phụ trách.
2. Ví dụ thực tế
Triển khai tại Mini-app (Controller)
import 'package:tasco_module/tasco_module.dart';
class CarInsuranceController extends ModuleSlot {
static final instance = CarInsuranceController._();
CarInsuranceController._();
@override
String get moduleId => 'car_insurance';
@override
String get routePrefix => '/car';
@override
List<String> get notificationTypes => ['car_contract_approved', 'car_payment_reminder'];
@override
Future<void> init({required AppEnv env, required Interceptor hostInterceptor}) async {
// Khởi tạo DI riêng của module
setupMiniAppDi(env: env, hostInterceptor: hostInterceptor);
}
@override
List<RouteBase> routes() {
return [
GoRoute(
path: '$routePrefix/home',
builder: (context, state) => const CarHomeScreen(),
),
GoRoute(
path: '$routePrefix/form',
builder: (context, state) => const CarContractFormScreen(),
),
];
}
@override
Future<void> onNotification(ModuleNotification notification) async {
// Xử lý chuyển hướng trang hoặc thực hiện logic khi click vào push notification
}
@override
void dispose() {
// Giải phóng GetIt nội bộ của module
}
}
Đăng ký tại Host Shell (bootstrap.dart)
import 'package:tasco_module/tasco_module.dart';
import 'package:car_insurance/car_insurance.dart';
void bootstrap() {
final manager = ModuleManager();
// Đăng ký module bảo hiểm xe
manager.register(CarInsuranceController.instance);
// Gộp định tuyến trong Router chính
final router = GoRouter(
routes: [
GoRoute(path: '/', builder: (context, state) => const MainHomeScreen()),
...manager.collectRoutes(), // Tự động có thêm /car/home và /car/form
],
);
}