9

Một trong những mẫu cập nhật nhất bao gồm Cấu phần Kiến trúc Android là GithubBrowserSample do Google cung cấp. Tôi xem xét mã và một số câu hỏi nảy sinh:Tìm hiểu về cấu trúc Android Ví dụ thành phần GithubBrowserSample: Các tham số ViewModelModule, ViewModel

  1. tôi đã nhận thấy rằng ViewModelModule được bao gồm trong AppModule. Nó có nghĩa là tất cả các viewmodels được thêm vào đồ thị DI. Tại sao được thực hiện theo cách đó thay vì có riêng biệt Module cho mỗi Hoạt động/Phân đoạn sẽ chỉ cung cấp ViewModel cần thiết cho Hoạt động/Phân đoạn cụ thể?

  2. Trong ví dụ cụ thể này, trong đó mô hình chế độ xem được khởi tạo bằng cách sử dụng GithubViewModelFactory có cách nào để chuyển tham số đến ViewModel cụ thể không? Hoặc giải pháp tốt hơn sẽ là để tạo ra một setter trong ViewModel và thiết lập param cần thiết thông qua setter?

+0

Ai đó đã tạo yêu cầu này: https://github.com/googlesamples/android-architecture-components/issues/148 –

Trả lời

4
  1. [...] Nó có nghĩa là tất cả các viewmodels được thêm vào đồ thị DI. Tại sao nó được thực hiện theo cách đó thay vì có Module riêng biệt cho mỗi Activity/Fragment [...]?

Chúng được thêm vào biểu đồ DI nhưng chưa được tạo. Thay vào đó, chúng kết thúc trong một bản đồ của các nhà cung cấp, như là seen in the ViewModelFacory.

@Inject 
public GithubViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) { } 

Vì vậy, bây giờ chúng tôi có một GithubViewModelFactory rằng có một danh sách các nhà cung cấp và có thể tạo ra bất kỳ ViewModel đã được ràng buộc. Các mảnh vỡ và hoạt động bây giờ có thể chỉ cần tiêm nhà máy và lấy ViewModel của họ.

@Inject 
ViewModelProvider.Factory viewModelFactory; 

// ...later... 
repoViewModel = ViewModelProviders.of(this, viewModelFactory).get(RepoViewModel.class); 

Vì lý do ... bạn có thể tạo ViewModelProvider.Factory cho mọi Hoạt động/Phân đoạn và đăng ký triển khai trong mọi Mô-đun. Tuy nhiên, đây sẽ là rất nhiều mã bản mẫu soạn sẵn.

  1. Trong ví dụ cụ thể này, nơi viewmodels được khởi tạo sử dụng GithubViewModelFactory là có cách nào để vượt qua một tham số đến ViewModel cụ thể? Hoặc giải pháp tốt hơn sẽ là tạo ra một setter trong ViewModel và thiết lập param cần thiết thông qua setter?

Nó có vẻ như tất cả các ViewModels chỉ phụ thuộc vào đối tượng @Singleton — đó là cần thiết, vì tất cả họ đều được cung cấp từ các AppComponent. Điều này có nghĩa là không có cách nào để chuyển vào "tham số" khác với các phụ thuộc khác của @Singleton. Vì vậy, như bạn đã đề xuất, bạn sẽ phải di chuyển nhà máy xuống thành phần Hoạt động/Phân đoạn để bạn có thể cung cấp phụ thuộc có phạm vi thấp hơn hoặc sử dụng phương pháp setter.

+0

Với phiên bản dagger2 trước đó (không có dagger.android) tôi đã sử dụng các thành phần phụ. Trong hoạt động như vậy, tôi có thể làm App.get (context) .appComponent.plus (MyModule ("12345")). Inject (this). Vì vậy, trong mô-đun này tôi có thể nhanh chóng nhà máy với param ViewModelProvider.Factor ("12345") mà có thể tạo cho tôi ViewModel với param. Làm thế nào tôi có thể làm tương tự bằng cách sử dụng tiêm dagger.android? –

+0

Tôi đã tìm thấy phương pháp này https://github.com/Nimrodda/dagger-androidinjector/blob/master/app/src/main/java/org/codepond/daggersample/feature/FeatureModule.java#L32 Có thể đó là cách –

+0

@VadimsSavjolovs lưu ý rằng các phần android vẫn còn trong '@ Beta'. Hiện tại không có hỗ trợ cho các mô-đun không xây dựng mặc định, vì vậy liên kết bạn đã đăng có vẻ như một cách tiếp cận có thể –

Các vấn đề liên quan