将数据传递给PageKeyedDataSource

时间:2018-10-04 21:23:44

标签: android paging dagger-2

我正在使用PageKeyedDataSource通过调用API并使用翻新进行分页。

我正在使用 Dagger 2 进行依赖项注入。

@Provides
Repository provideRepository(...) {
    ...
}

@Provides
PageKeyedVideosDataSource providePageKeyeVideosDataSource(Repository repository) {
    ...
}

@Provides
VideoDataSourceFactory provideVideoDataSourceFactory(PageKeyedHomeVideosDataSource pageKeyedHomeVideosDataSource) {
    ...
}

@Provides
ViewModelFactory provideViewModelFactory(Repository repository, VideoDataSourceFactory videoDataSourceFactory) {
    ...
}

现在,我需要做同样的事情,但是我的调用需要一个新参数:一个id。

@GET(Urls.VIDEOS_BY_CATEGORY)
    Observable<RequestVideo> getVideosByCategory(
            @Path("id") int categoryId,  // <-- Now I need this new parameter
            @Query("per-page") int perPage,
            @Query("page") int page);

在此之前,我的PageKeyedVideosDataSource仅需要页面和每页进行调用,这很容易。但是,现在我需要将这个新参数id动态地放在PageKeyedDataSource中。

我看到了PagingWithNetworkSample并发现他们通过在构造函数中添加了新参数来在PagedKeyedDataSource中添加了新参数。然后,我考虑过这样做:

public PageKeyedCategoryVideosDataSource(int categoryId, Repository repository) {
    this.categoryId = categoryId;
    this.repository = repository;
}

但是,如果我在构造函数中添加id,我认为我将不再能够使用dagger 2,因为通过使用dagger 2,PageKeyedVideosDataSource不会动态创建,因此,我无法继续更改ID。

我需要像这样动态创建PageKeyedDataSource:

int categoryId = getCategoryId();
PageKeyedVideosDataSource dataSource = new PageKeyedVideosDataSource(categoryId, repository);
  • 我应该这样做而不使用Dagger 2吗?
  • 是否仍可以使用Dagger 2动态创建数据源?

1 个答案:

答案 0 :(得分:1)

尽管回答迟了,也许可以帮助其他人。

当您需要将“动态”参数传递到dagger的图形中时,dagger无法创建依赖项的实例。在那种情况下,匕首会为您的PageKeyedVideosDataSource提供Factory,但是您必须手动将参数传递给构造函数。

您将拥有工厂(kotlin示例,但也可以在Java中工作):

class PageKeyedVideosDataSourceFactory @Inject constructor(
  private val repository: Repository
) {
  
  fun create(categoryId: Int): PageKeyedVideosDataSource {
   return PageKeyedVideosDataSource(categoryId, repository)
  }

}

然后不注入实例,而是注入PageKeyedVideosDataSourceFactory工厂并对其手动调用factory.create(categoryId)

如果要自动执行工厂创建,可以检查AssistedInject library(来自Square),它可以创建工厂的实现。