tasco_core
Package tasco_core là nhân thực thi (Framework Runtime Primitives) của Tasco App Framework. Gói này đóng gói các tính năng hệ thống liên quan tới môi trường cấu hình, quản lý các lớp bảo vệ tuyến đường (Guards), xử lý mạng tập trung và các cơ chế xử lý tải (Loading Manager).
1. Các tính năng cốt lõi
- App Môi trường (
AppEnv): Quản lý biến môi trường động hỗ trợ 3 Flavor chuẩn:development,staging,production. - Mạng lưới Interceptors (
Diosetup):AuthInterceptor: Tự động thêm headerAuthorization: Bearer <token>vào request. Tự động xử lý cơ chế làm mới token (Refresh Token) bất đồng bộ khi nhận HTTP Status 401 để đảm bảo phiên làm việc không bị gián đoạn.ErrorInterceptor: Định dạng hóa mọi lỗi HTTP/Dio về định dạng lỗi chung trước khi đẩy lên tầng UI.LoggingInterceptor&Alice: Hỗ trợ kiểm tra các request mạng trực quan (chỉ bật ở môi trường phi production).
- Loading Manager (
LoadingManager): Quản lý vòng quay tải (Spinner overlay) toàn cục dựa trên các thao tác luồng dữ liệu bất đồng bộ. - Route Guards: Các bộ lọc bảo vệ tuyến đường (ví dụ: yêu cầu đăng nhập mới được xem màn hình chính).
2. Hướng dẫn sử dụng
Cấu hình biến môi trường AppEnv
import 'package:tasco_core/tasco_core.dart';
void main() async {
// Khởi tạo môi trường
final env = AppEnv(
flavor: Flavor.staging,
baseUrl: 'https://staging-api.baohiemtasco.vn',
connectTimeout: const Duration(seconds: 15),
);
// Đăng ký vào GetIt
GetIt.I.registerSingleton<AppEnv>(env);
}
Sử dụng LoadingManager để hiển thị Loading Spinner
LoadingManager cung cấp overlay vòng quay tải dùng chung trong hệ thống:
import 'package:tasco_core/tasco_core.dart';
class ContractCubit extends Cubit<ContractState> {
final GetContractsUseCase _getContracts;
final LoadingManager _loadingManager;
ContractCubit(this._getContracts, this._loadingManager) : super(const ContractState());
Future<void> fetchContracts() async {
// Kích hoạt spinner overlay toàn cục
_loadingManager.show(status: 'Đang tải danh sách...');
try {
final list = await _getContracts();
emit(state.copyWith(status: LoadingStatus.success, contracts: list));
} catch (e) {
emit(state.copyWith(status: LoadingStatus.failure, error: e));
} finally {
// Tắt spinner overlay
_loadingManager.dismiss();
}
}
}