Skip to main content

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
],
);
}