Đã đến lúc rồi ! Koin 2.0 phiên bản Ổn định đã chính thức ra mắt. 6 tháng phát triển, viết lại, phân tích API và phản hồi từ người dùng. Và tất cả những điều này với một thách thức thực sự: giữ sự đơn giản của Koin!
1.Startup DSL
Hàm startKoin()
cũ được thay thế bằng một startup DSL. Cung cấp chức năng khởi tạo cho mỗi platform và ẩn đi tất cả các options với các tham số mặc định là một sự lựa chọn quickstart tốt, nhưng nó sẽ locked nhiều khả năng phát triển. Bây giờ chúng ta cần mở rộng và thêm các khái niệm mới dễ dàng, và cũng làm cho các định nghĩa tải hiệu quả hơn.
Làm thế nào để chúng ta bắt đầu Koin 2.0? Vẫn với func startKoin
, nhưng bây giờ bạn cần khai báo những gì bạn sẽ sử dụng:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">fun</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">vararg</span> args<span class="token operator">:</span> String<span class="token punctuation">)</span> <span class="token punctuation">{</span> startKoin <span class="token punctuation">{</span> <span class="token comment">// use Koin logger</span> <span class="token function">printLogger</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// declare used modules</span> <span class="token function">modules</span><span class="token punctuation">(</span>appModule<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Đối với Android, đừng quên khai báo AndroidContext của bạn với chức năng androidContext:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">class</span> MainApplication <span class="token operator">:</span> <span class="token function">Application</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">override</span> <span class="token keyword">fun</span> <span class="token function">onCreate</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">onCreate</span><span class="token punctuation">(</span><span class="token punctuation">)</span> startKoin <span class="token punctuation">{</span> <span class="token comment">// Use Koin Android Logger</span> <span class="token function">androidLogger</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// declare Android context</span> <span class="token function">androidContext</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token label symbol">@MainApplication</span><span class="token punctuation">)</span> <span class="token comment">// declare modules to use</span> <span class="token function">modules</span><span class="token punctuation">(</span>module1<span class="token punctuation">,</span> module2 <span class="token operator">..</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
2.Better Performances 🚀
Một trong những đối số chính để nâng cấp lên Koin 2.0, là hiệu suất động cơ mới.
Năm ngoái, Rafa Vázquez đã viết một dự án điểm chuẩn để giúp đo lường một số màn trình diễn cho framework DI. Điều này giúp tôi rất rõ ràng xem xét nội bộ. Điểm chuẩn này chạy một dự án gồm 400 định nghĩa.
Dưới đây là điểm chuẩn cho Koin 1.0:
Bây giờ với Koin 2.0:
Koin đã đạt được sự cải thiện hiệu suất lớn. Bạn không nên lo lắng về hiệu suất ngay bây giờ 😉 Trái với code generate, chúng tôi cần phân tích các thành phần khi bắt đầu. Nhưng điều này rất nhanh để tiến hành ngay bây giờ.
3.Definitions & Modules 🛠
Koin DSL vẫn giữ nguyên! Nó đã được đơn giản hóa bằng cách loại bỏ các tính năng không được sử dụng và ngụ ý sự phức tạp vô dụng. Sau đó, không còn khai báo mô-đun bên trong, quy tắc hiển thị kỳ lạ và khai báo API phạm vi đã được sửa đổi hoàn toàn.
Thay đổi chính đầu tiên mà bạn sẽ nhận thấy là chúng tôi không sử dụng chuỗi trực tiếp nữa để đặt tên cho các thành phần của mình. Chúng tôi sử dụng qualifiers thay vì hàm named()
. Hàm này có thể lấy một chuỗi hoặc một loại để giúp đủ điều kiện định nghĩa hoặc phạm vi. Điều này cho chúng ta một tên hợp lý cho một thành phần.
1 2 3 | <span class="token comment">// naming with named("mock") instead of "mock"</span> single<span class="token operator"><</span>MyRepository<span class="token operator">></span><span class="token punctuation">(</span><span class="token function">named</span><span class="token punctuation">(</span>“mock"<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">MyMockRepository</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Bây giờ nên hiểu đơn giản hơn về toán tử ràng buộc DSL (bind). Hãy xem xét rằng toán tử này thêm một loại ràng buộc thứ cấp vào định nghĩa của bạn. Để làm cho nó rõ ràng hơn, hãy để khác xem nó như là một khía cạnh bổ sung về định nghĩa của bạn. API Koin có một hàm bind ()
mới để giúp bạn truy xuất các thành phần được khai báo với toán tử bind
trong mô-đun của bạn.
Một ví dụ tốt có thể giúp hiểu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | module <span class="token punctuation">{</span> single<span class="token operator"><</span>ComponentInterface1<span class="token operator">></span> <span class="token punctuation">{</span> <span class="token function">Default</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> single <span class="token punctuation">{</span> <span class="token function">Component1</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> bind Simple<span class="token punctuation">.</span>ComponentInterface1<span class="token operator">::</span><span class="token keyword">class</span> single <span class="token punctuation">{</span> <span class="token function">Component2</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> bind Simple<span class="token punctuation">.</span>ComponentInterface1<span class="token operator">::</span><span class="token keyword">class</span> <span class="token punctuation">}</span> <span class="token comment">// resolve Default instance</span> <span class="token keyword">get</span><span class="token operator"><</span>ComponentInterface1<span class="token operator">></span> <span class="token comment">// resolve Component1, casted as ComponentInterface1</span> koin<span class="token punctuation">.</span>bind<span class="token operator"><</span>ComponentInterface1<span class="token punctuation">,</span>Component1<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// resolve all instances matching ComponentInterface1: Default, Component1 & Component2</span> koin<span class="token punctuation">.</span>getAll<span class="token operator"><</span>ComponentInterface1<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span> |
4.Loading & unloading modules ♻️
Vì nó dễ dàng tải các mô-đun trong Koin (thông qua startKoinor loadKoinModules), nên cũng dễ dàng dỡ tải một mô-đun. Hàm unloadKoinModules () giúp bạn loại bỏ các định nghĩa và thể hiện:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">val</span> coffeeAppModule <span class="token operator">=</span> module <span class="token punctuation">{</span> single <span class="token punctuation">{</span> <span class="token function">CoffeeMaker</span><span class="token punctuation">(</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> single<span class="token operator"><</span>Pump<span class="token operator">></span> <span class="token punctuation">{</span> <span class="token function">Thermosiphon</span><span class="token punctuation">(</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> single<span class="token operator"><</span>Heater<span class="token operator">></span> <span class="token punctuation">{</span> <span class="token function">ElectricHeater</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// starting your module either by startKoin</span> startKoin <span class="token punctuation">{</span> <span class="token function">modules</span><span class="token punctuation">(</span>coffeeAppModule<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// or after start</span> <span class="token function">loadKoinModules</span><span class="token punctuation">(</span>coffeeAppModule<span class="token punctuation">)</span> <span class="token comment">// resolve CoffeeMaker</span> <span class="token keyword">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator"><</span>CoffeeMaker<span class="token operator">></span> <span class="token comment">// drop module's definitions & instances when you don't need it anymore</span> <span class="token function">unloadKoinModules</span><span class="token punctuation">(</span>coffeeAppModule<span class="token punctuation">)</span> <span class="token comment">// Won't resolve CoffeeMaker instance, no more definition </span> <span class="token keyword">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator"><</span>CoffeeMaker<span class="token operator">></span> |
Cùng với đó, chúng tôi có thể xử lý các mô-đun Koin một cách linh hoạt: tải và dỡ tải theo ý muốn, dựa trên bối cảnh ứng dụng của bạn. Các trường hợp tụt lại phía sau hoạt động như vậy, liên quan đến các định nghĩa single & scrope.
5.Some other new incomings in the Koin APIs ✨
Một số thứ nhỏ có thể giúp bạn trong những trường hợp đặc biệt, được yêu cầu từ cộng đồng.
Bạn có thể thử yêu cầu một thành phần không được xác định hoặc trường hợp có thể giải quyết được trường hợp:
1 2 | <span class="token function">getOrNull</span><span class="token punctuation">(</span><span class="token punctuation">)</span> & <span class="token function">injectOrNull</span><span class="token punctuation">(</span><span class="token punctuation">)</span> |
Tính năng thú vị khác, là khả năng thêm một thể hiện nhanh chóng. Sử dụng hàm khai báo () để cung cấp một đối tượng cho Koin. Nó sẽ khai báo nó như một định nghĩa đơn mới cho bạn:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token comment">// Given a Koin application</span> <span class="token keyword">val</span> koin <span class="token operator">=</span> koinApplication <span class="token punctuation">{</span> <span class="token function">printLogger</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token function">modules</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// no definition</span> <span class="token punctuation">}</span><span class="token punctuation">.</span>koin <span class="token comment">// given an instance</span> <span class="token keyword">val</span> a <span class="token operator">=</span> <span class="token function">ComponentA</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// declare the instance as Single</span> koin<span class="token punctuation">.</span><span class="token function">declare</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span> <span class="token comment">// can retrieve our ComponentA instance</span> koin<span class="token punctuation">.</span>get<span class="token operator"><</span>ComponentA<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span> |
6.Koin Isolation ⚙️
API Koin đã được thiết kế lại để cho phép bạn tạo một phiên bản cục bộ của Koin. Thay vì sử dụng hàm khai báo startKoin khai báo thể hiện Koin của bạn vào GlobalContext, hãy sử dụng hàm koinApplication để khai báo một thể hiện Koin cục bộ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token comment">// Local Koin application instance</span> <span class="token keyword">val</span> mylocalKoinInstance <span class="token operator">=</span> koinApplication <span class="token punctuation">{</span> <span class="token comment">// declare used modules</span> <span class="token function">modules</span><span class="token punctuation">(</span> module <span class="token punctuation">{</span> single <span class="token punctuation">{</span> <span class="token function">ComponentA</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// Custom KoinComponent using mylocalKoinInstance & not the Global context</span> <span class="token keyword">interface</span> CustomKoinComponent <span class="token operator">:</span> KoinComponent <span class="token punctuation">{</span> <span class="token comment">// override the used Koin instance to use mylocalKoinInstance</span> <span class="token keyword">override</span> <span class="token keyword">fun</span> <span class="token function">getKoin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> Koin <span class="token operator">=</span> mylocalKoinInstance<span class="token punctuation">.</span>koin <span class="token punctuation">}</span> <span class="token comment">// An example of component that use mylocalKoinInstance</span> <span class="token keyword">class</span> MyCustomApp <span class="token operator">:</span> CustomKoinComponent <span class="token punctuation">{</span> <span class="token keyword">val</span> a<span class="token operator">:</span> ComponentA <span class="token keyword">by</span> <span class="token function">inject</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Một cá thể Koin cục bộ / bị cô lập không được đăng ký trong Bối cảnh toàn cầu. Rõ ràng, bạn có thể sử dụng trực tiếp các phần mở rộng KoinComponents tiêu chuẩn. Thay vào đó, bạn phải chỉ định sử dụng thể hiện cục bộ của mình (ghi đè hàm getKoin () từ giao diện KoinComponent).
7.New Scope API ⚠️
Phạm vi là một bối cảnh với một khoảng thời gian cố định, trong đó một đối tượng tồn tại. Khi phạm vi kết thúc, mọi đối tượng bị ràng buộc trong phạm vi đó không thể được tiêm lại. Để có một hình ảnh về điều đó tốt hơn, hãy nghĩ rằng một phạm vi giống như một cái hộp: một không gian nơi bạn đặt đồ đạc và ném nó khi bạn don sắt cần nó nữa. Làm cách nào để sử dụng API phạm vi mới?
Bây giờ chúng tôi tuyên bố và sử dụng phạm vi như thế:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | module <span class="token punctuation">{</span> <span class="token comment">// main scope MyComponent definition</span> single<span class="token operator"><</span>MyComponent<span class="token operator">></span> <span class="token punctuation">{</span> <span class="token function">DefaultImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">scope</span><span class="token punctuation">(</span><span class="token function">named</span><span class="token punctuation">(</span>¨MY_SCOPE¨<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// MY_SCOPE definition</span> scoped<span class="token operator"><</span>MyComponent<span class="token operator">></span> <span class="token punctuation">{</span> <span class="token function">ScopeImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">val</span> myScopeInstance <span class="token operator">=</span> koin<span class="token punctuation">.</span><span class="token function">createScope</span><span class="token punctuation">(</span><span class="token string">"myScopeId"</span><span class="token punctuation">,</span><span class="token function">named</span><span class="token punctuation">(</span>¨MY_SCOPE¨<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// will give the ScopeImpl instance </span> myScopeInstance<span class="token punctuation">.</span>get<span class="token operator"><</span>MyComponent<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span> |
Cuối cùng, trên bất kỳ trường hợp phạm vi nào, bạn có thể khai báo một thành phần đang hoạt động:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | module <span class="token punctuation">{</span> <span class="token comment">// empty Scope definition</span> <span class="token function">scope</span><span class="token punctuation">(</span><span class="token function">named</span><span class="token punctuation">(</span>¨MY_SCOPE¨<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// given an instance</span> <span class="token keyword">val</span> a <span class="token operator">=</span> <span class="token function">ComponentA</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// given a scope instance</span> <span class="token keyword">val</span> myScopeInstance <span class="token operator">=</span> koin<span class="token punctuation">.</span><span class="token function">createScope</span><span class="token punctuation">(</span><span class="token string">"myScopeId"</span><span class="token punctuation">,</span><span class="token function">named</span><span class="token punctuation">(</span>¨MY_SCOPE¨<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// will register your instance as a Scoped definition</span> myScopeInstance<span class="token punctuation">.</span><span class="token function">declare</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span> <span class="token comment">// will give back the instance</span> myScopeInstance<span class="token punctuation">.</span>get<span class="token operator"><</span>ComponentA<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// drop instances & will loose your ComponentA definition</span> myScopeInstance<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span> |
8. Load/Unload modules vs Scope API?
Với những tính năng mới này, chúng tôi có một số khả năng để xử lý các thành phần trong một khoảng thời gian giới hạn. Vậy thì có sử dụng API phạm vi hay không? Nó phụ thuộc nhiều hơn vào trường hợp sử dụng của bạn và cách bạn phải quản lý việc tạo các thể hiện đó. Nếu bạn cần mức độ chi tiết tốt hơn (thời gian hoặc định nghĩa), API Phạm vi dành riêng cho điều đó
9.Stronger Android support ✅
Với API Phạm vi mới như vậy, chúng tôi có thể cung cấp cho bạn các công cụ thú vị cho Hoạt động & Mảnh vỡ Android của bạn. Bạn có thể dễ dàng khai báo một phạm vi được gắn với chế độ xem của bạn và dễ dàng truy xuất mọi thứ từ nó bằng thuộc tính currentScope (tiện ích mở rộng Koin Lần cho các thành phần LifecyclOwner):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | module <span class="token punctuation">{</span> <span class="token comment">// declare a scope for MyActivity</span> <span class="token function">scope</span><span class="token punctuation">(</span>named<span class="token operator"><</span>MyActivity<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> scoped <span class="token punctuation">{</span> <span class="token function">MyPresenter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> MyActivity <span class="token operator">:</span> AppCompatActivity <span class="token punctuation">{</span> <span class="token comment">// get presenter from current scope</span> <span class="token keyword">val</span> presenter <span class="token operator">:</span> MyPresenter <span class="token keyword">by</span> currentScope<span class="token punctuation">.</span><span class="token function">inject</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> MyFragment <span class="token operator">:</span> <span class="token function">Fragment</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">override</span> <span class="token keyword">fun</span> <span class="token function">onViewCreated</span><span class="token punctuation">(</span><span class="token operator">..</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// get Presenter instance from Activity's scope</span> <span class="token keyword">val</span> presenter <span class="token operator">:</span> MyPresenter <span class="token keyword">by</span> lazy <span class="token punctuation">{</span> activity<span class="token operator">?</span><span class="token punctuation">.</span>currentScope<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Thuộc tính currentScope được tạo khi bạn truy cập và theo vòng đời của thành phần Android. Nó bị hủy khi nhận tín hiệu ON_DESTROY.
API phạm vi Android này có mặt trong các gói koin-android-scope và koin-android-viewmodel (cũng dành cho AndroidX).
Rất nhiều bản sửa lỗi đã được thực hiện cho phần ViewModel. API trên toàn cầu vẫn giữ nguyên, nhưng đã được đơn giản hóa:
- Thuộc tính name của định nghĩa được sử dụng làm id ViewModel
- Lấy một cá thể ViewModel cho một lớp nhất định có thể được thực hiện trực tiếp với getViewModel và bởi viewModel
- ViewModels có thể được khai báo trong một phạm vi, để giúp giải quyết các phụ thuộc từ phạm vi này
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | module <span class="token punctuation">{</span> viewModel <span class="token punctuation">{</span> <span class="token punctuation">(</span>id<span class="token operator">:</span> String<span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token function">SimpleViewModel</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">viewModel</span><span class="token punctuation">(</span><span class="token function">named</span><span class="token punctuation">(</span><span class="token string">"vm1"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span>id<span class="token operator">:</span> String<span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token function">SimpleViewModel</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">viewModel</span><span class="token punctuation">(</span><span class="token function">named</span><span class="token punctuation">(</span><span class="token string">"vm2"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span>id<span class="token operator">:</span> String<span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token function">SimpleViewModel</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> MyActivity <span class="token operator">:</span> <span class="token function">AppCompatActivity</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Get ViewModel by given KCLass</span> <span class="token keyword">val</span> simpleViewModel<span class="token operator">:</span> SimpleViewModel <span class="token keyword">by</span> <span class="token function">viewModel</span><span class="token punctuation">(</span>clazz <span class="token operator">=</span> SimpleViewModel<span class="token operator">::</span><span class="token keyword">class</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">parametersOf</span><span class="token punctuation">(</span>DEFAULT_ID<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// Get ViewModels by name</span> <span class="token keyword">val</span> vm1<span class="token operator">:</span> SimpleViewModel <span class="token keyword">by</span> <span class="token function">viewModel</span><span class="token punctuation">(</span><span class="token function">named</span><span class="token punctuation">(</span><span class="token string">"vm1"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">parametersOf</span><span class="token punctuation">(</span><span class="token string">"vm1"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">val</span> vm2<span class="token operator">:</span> SimpleViewModel <span class="token keyword">by</span> <span class="token function">viewModel</span><span class="token punctuation">(</span><span class="token function">named</span><span class="token punctuation">(</span><span class="token string">"vm2"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">parametersOf</span><span class="token punctuation">(</span><span class="token string">"vm2"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Làm việc với ViewModel và phạm vi giờ đây dễ dàng hơn:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | module <span class="token punctuation">{</span> <span class="token function">scope</span><span class="token punctuation">(</span><span class="token function">named</span><span class="token punctuation">(</span><span class="token string">"MY_SCOPE"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span> scoped <span class="token punctuation">{</span> <span class="token function">Session</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// retrieve Session dependency from current scope</span> viewModel <span class="token punctuation">{</span> <span class="token function">ViewModeWithScope</span><span class="token punctuation">(</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> MyActivity <span class="token operator">:</span> <span class="token function">AppCompatActivity</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// create scope instance</span> <span class="token keyword">val</span> myScope <span class="token operator">=</span> <span class="token function">getKoin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string">"myScope"</span><span class="token punctuation">,</span><span class="token function">named</span><span class="token punctuation">(</span><span class="token string">"MY_SCOPE"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// give scopeId to your ViewModel instance</span> <span class="token keyword">val</span> myScopeViewModel <span class="token keyword">by</span> myScope<span class="token punctuation">.</span><span class="token function">viewModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
10.Android Experimental Features ✨
Các tính năng thử nghiệm cho Android đã được trích xuất sang các gói bên ngoài. Bạn phải thiết lập nó với các gói sau:
1 2 | koin-android-ext & koin-androidx-ext |
Các tính năng thử nghiệm này đề xuất một phiên bản DSL mà không yêu cầu bạn phải viết hàm tiêm hàm xây dựng của mình:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token keyword">class</span> <span class="token function">CoffeeMaker</span><span class="token punctuation">(</span><span class="token keyword">val</span> pump <span class="token operator">:</span> Pump<span class="token punctuation">,</span> <span class="token keyword">val</span> heater <span class="token operator">:</span> Heater<span class="token punctuation">)</span> <span class="token keyword">class</span> <span class="token function">Thermosiphon</span><span class="token punctuation">(</span><span class="token keyword">val</span> heater <span class="token operator">:</span> Heater<span class="token punctuation">)</span> <span class="token operator">:</span> Pump <span class="token keyword">class</span> ElectricHeater <span class="token operator">:</span> Heater <span class="token keyword">class</span> <span class="token function">CoffeeMakerViewModel</span><span class="token punctuation">(</span><span class="token keyword">val</span> coffeeMaker <span class="token operator">:</span> CoffeeMaker<span class="token punctuation">)</span> <span class="token keyword">val</span> coffeeAppModule <span class="token operator">=</span> module <span class="token punctuation">{</span> single<span class="token operator"><</span>CoffeeMaker<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span> singleBy<span class="token operator"><</span>Pump<span class="token punctuation">,</span>Thermosiphon<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span> singleBy<span class="token operator"><</span>Heater<span class="token punctuation">,</span>ElectricHeater<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span> viewModel<span class="token operator"><</span>CoffeeMakerViewModel<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> CoffeeActivity <span class="token operator">:</span> <span class="token function">AppCompatActivity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">// get your coffee here :)</span> <span class="token keyword">val</span> coffeeMakerViewModel <span class="token operator">:</span> CoffeeMakerViewModel <span class="token keyword">by</span> <span class="token function">viewModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |