2017-07-28 14 views
16

Tôi hiện đang thử nghiệm với InstantApps và muốn đưa dao găm vào dự án của mình.Tạo Ứng dụng tức thì Android với Thành phần ứng dụng từ Dagger

Tôi đang gặp sự cố khi thiết lập ứng dụng AppComponent. Thành phần ứng dụng của tôi bao gồm tất cả các mô-đun dagger tính năng của ứng dụng của tôi.

tôi về cơ bản có:

  • Một mô-đun ứng dụng cơ sở chứa lớp ứng dụng của tôi
  • Nhiều tính năng với mỗi một con dao găm Mô-đun cho mỗi hoạt động, tất cả với cơ sở như một sự phụ thuộc.
  • Một mô-đun ứng dụng và mô-đun ngay cả khi nhập tất cả các tính năng và mô-đun ứng dụng cơ sở.

Tôi đang cố gắng tìm ra thiết lập trước khi thêm mô-đun ứng dụng tức thì.

Từ tài liệu về InstantApps và ví dụ dự án. Có vẻ như lớp Ứng dụng cần phải ở trong Cơ sở. Từ tài liệu Dagger, để thiết lập dagger:

DaggerYourAppComponent.create().inject(this); 

Nên được bao gồm trong lớp ứng dụng của bạn. Tuy nhiên, điều này có vẻ là không thể khi AppComponent cần tham khảo tất cả các mô-đun dagger tính năng.

tôi hỏi là:

  • tôi nên thêm mô-đun dao găm AppComponent của tôi ở đâu?
  • Tôi có nên giữ ứng dụng của mình trong mô-đun ứng dụng chứ không phải trong Cơ sở không?
  • Bất kỳ repo hoặc tài liệu GitHub nào xung quanh Dagger với Ứng dụng tức thì?

Cảm ơn bạn

+0

Từ này [InstantApps Tương thích Thư viện] (https://developer.android.com/topic/instant-apps/prepare.html#identify_tested_compatible_libraries) liên kết, có thể Dagger không chỉ được hỗ trợ ... –

+0

Liên kết đó chỉ dành cho các thư viện của Google chứ không phải thứ 3 -buổi tiệc. – TWL

+0

bạn có thể kiểm tra url này https://github.com/ragdroid/instant-app-dagger có thể nó giúp bạn. –

Trả lời

9
  • Dagger2 được rất nhiều hỗ trợ với các ứng dụng tức thì. Bạn có thể tạo các lớp thành phần cho mỗi mô-đun tính năng và một lớp nhà cung cấp Dagger tương ứng để trưng ra cá thể lớp thành phần cho mỗi mô-đun tính năng.
  • Mỗi lớp thành phần mô-đun có thể khai báo phương thức tiêm cho các lớp chỉ chứa trong mô-đun tính năng đó.
  • Ngoài ra, bạn cũng có thể có lớp thành phần Ứng dụng trong mô-đun cơ sở để phun ứng dụng rộng rãi.
  • Lớp thành phần ứng dụng có thể được khởi tạo trong lớp ứng dụng được bao gồm trong mô đun cơ sở và được tiếp xúc với các mô-đun tính năng khác thông qua phương pháp tĩnh trong lớp ứng dụng.

Dưới đây là mã mẫu của tiêm Dagger2 với ứng dụng tức thì để làm cho mọi thứ rõ ràng hơn. https://github.com/willowtreeapps/android-instant-apps-demo

+0

Cảm ơn bạn vì @Vishy này. Tôi nghĩ bạn đúng, tôi cần một thành phần cho mỗi tính năng. Tuy nhiên, tôi vẫn đang tìm một mẫu sử dụng hỗ trợ dagger android và với 'AndroidInjection.inject (MyActivity.this)' và AndroidInjector từ [đây] (https://google.github.io/dagger/android. html). Bất kỳ kế hoạch cập nhật mẫu của bạn? –

+0

Để cụ thể hơn, ở bước 3 của [hướng dẫn] (https://google.github.io/dagger/android.html#injecting-activity-objects): '@Component (modules = {... , YourActivityModule.class}) Giao diện YourApplicationComponent {} ' Bước này không thể thực hiện được vì thành phần ứng dụng của tôi không có khả năng hiển thị trên' ActivityModule' như trong mô-đun tính năng. –

0

Tôi đã viết một bài viết về điều này với nhiều chi tiết: Dagger2 for Modular Architecture, nhưng sau câu trả lời ngắn.

Bạn phải sử dụng Dagger2 theo cách khác. Thay vì sử dụng một mô-đun hoặc tiểu hợp phần cho mỗi mô-đun tính năng, bạn cần phải sử dụng một thành phần có sự phụ thuộc vào phần tử AppComponent cơ sở.

Trong một mô-đun duy nhất chúng tôi thường làm một cái gì đó như thế này:

@Singleton 
@Component(modules = arrayOf(NetworkModule::class, RepositoryModule::class, 
        SubcomponentModule::class)) 
interface ApplicationComponent : AndroidInjector<MyApplication> { 
    val userRepository: UserRepository 
    val apiService: ApiService 
} 

@Module 
object NetworkModule { 
    @Provides 
    @Singleton 
    @JvmStatic 
    fun provideApiService(okHttp: OkHttp): ApiService { 
    return ApiSerive(okHttp) 
    } 
} 

Nhưng như bạn nói bạn không có quyền truy cập vào SubComponentModule đó có thể là trong một mô-đun hoặc dao găm tham khảo module trong một mô-đun tính năng.

Bạn chỉ có thể tạo ra một mô-đun dao găm mới trong một mô-đun tính năng tùy thuộc vào ApplicationComponent như thế này:

@Browser 
@Component(modules = [(BrowserModule::class)], 
     dependencies = [(AppComponent::class)]) 
interface BrowserComponent : AndroidInjector<AppCompatActivity> { 
    @Component.Builder 
    abstract class Builder: AndroidInjector.Builder<AppCompatActivity>(){ 
    /** 
    * explicity declare to Dagger2 
    * that this builder will accept an AppComponent instance 
    **/ 
    abstract fun plus(component: AppComponent): Builder 
    } 
} 

Và hoạt động tính năng tương ứng sẽ xây dựng các thành phần:

class BrowserActivity : AppCompatActivity() { 
    override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    DaggerBrowserComponent 
     .builder() 
     /** 
     * we have to provide an instance of the AppComponent or 
     * any other dependency for this component 
     **/ 
     .plus((application as MyApplication).component) 
     .build() 
     .inject(this) 
    } 
} 
Các vấn đề liên quan