Sử dụng dependency injection với getIt trong flutter

1 Dependency Injection là gì?
_ Dependency Injection (DI) là một design pattern, một kỹ thuật cho phép xoá bỏ sự phụ thuộc giữa các module làm cho ứng dụng dễ dàng hơn trong việc thay đổi module, bảo trì code và testing.
_Các module không giao tiếp trực tiếp với nhau mà thông qua interface. Module cấp thấp sẽ implement interface, module cấp cao sẽ gọi module cấp thấp thông qua interface.

2 Các dạng denpendency Injection
_ Constructor Injection: Các denpendency sẽ được truyền vào 1 class thông qua constructor của class đó.
_ Setter Injection: Các denpendency sẽ được truyền vào thông qua hàm Setter
_ Interface Injection: Class sẽ implement 1 interface. Interface này chứa 1 hàm inject. Các denpendency sẽ được truyền thông qua hàm inject. Cách này ít được sử dụng

3 Sử dụng dependency với getIT
_ Thêm 2 thư viện get_it và injectable vào dependencies:

get_it: ^7.6.0
injectable: ^2.1.1

_ Thêm 2 thư viện build_runner và injectable_generator vào dev_devpendencies:

build_runner: ^2.3.3
injectable_generator: ^2.1.3

_ Tạo các class cần sử dụng và tạo một module:

_ Có thể tạo 1 injectable:

_ Tạo 1 file injection.dart:

_ Tạo một class view model sử dụng injectable

_ sau đó run lệch:
+) flutter packages pub run build_runner watch
+) flutter packages pub run build_runner build

_ flutter sẽ sinh ra file injection.config

_ ở viewModel khi cần object nào thì chỉ việc lấy ra và sử dụng

3 Ưu điểm của DI
_ Giảm sự kết dính giữa các module
_ Code dễ bảo trì, dễ thay thế module
_ Dễ test và viết Unit Test

4 Nhược điểm DI
_ Sử dụng interface nên đôi khi khó debug, do không biết chính xác module nào được gọi
_ Các object được khởi tạo ngay từ đầu, có thể làm giảm performance
_ Làm tăng độ phức tạp của code