gpt4 book ai didi

android - 将数据传递给 PageKeyedDataSource

转载 作者:行者123 更新时间:2023-12-03 13:25:36 26 4
gpt4 key购买 nike

我正在使用 PageKeyedDataSource通过调用 API 和使用 Retrofit 进行分页。

我正在使用 Dagger 2 进行依赖注入(inject)。

@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 的数据源?
  • 最佳答案

    虽然回答迟了,但也许可以帮助别人。
    当您需要将“动态”参数传递到 dagger 的图表时,dagger 无法创建依赖项的实例。在这种情况下,dagger 将为您的 PageKeyedVideosDataSource 提供 Factory,但您必须手动将参数传递给构造函数。
    您将拥有工厂(kotlin 示例,但也可以在 java 中工作):

    class PageKeyedVideosDataSourceFactory @Inject constructor(
    private val repository: Repository
    ) {

    fun create(categoryId: Int): PageKeyedVideosDataSource {
    return PageKeyedVideosDataSource(categoryId, repository)
    }

    }
    然后不是注入(inject)实例,而是注入(inject) PageKeyedVideosDataSourceFactory工厂和人工调用 factory.create(categoryId)在上面。
    如果您想自动创建工厂,您可以查看 AssistedInject library (来自 Square)它可以创建工厂的实现。

    关于android - 将数据传递给 PageKeyedDataSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52655351/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com