【问题标题】:Does HILT supports injecting generic types?HILT 是否支持注入泛型类型?
【发布时间】:2020-12-09 06:33:29
【问题描述】:

我在编译期间遇到错误,使用 HILT 进行 DI。

组件方法不能有类型变量

它抱怨下面的代码

public abstract class BaseDialogFragment extends DialogFragment {

        @EntryPoint
        @InstallIn(ApplicationComponent.class)
        interface BaseDialogFragmentEntryPoint {
                public <T extends ViewModelBase> T T();
        }

        protected ViewModelBase dataContext;

        protected <T extends ViewModelBase> T configure(Class<T> type)
        {
                BaseDialogFragmentEntryPoint baseDialogFragmentEntryPoint = EntryPointAccessors.fromApplication(getActivity().getApplicationContext(), BaseDialogFragmentEntryPoint.class);
                T viewModel = baseDialogFragmentEntryPoint.T();
                this.dataContext = viewModel;
                return viewModel;
        }

}

ViewModelBase 类由类数扩展。

HILT 是否支持注入通用对象?我没有找到太多关于 HILT 的信息。

【问题讨论】:

    标签: android generics dependency-injection dagger-hilt


    【解决方案1】:

    如果您的目标是将 ViewModel 的实例从“BaseFragment”覆盖到“ChildFragment”,您可以在 Base 中创建一个抽象变量,并使用 kotlin 提供的 by viewModels() 委托对其进行初始化。为了能够创建 ViewModel 的实例,您还需要使用 @HiltViewModel 注释来注释您的 ViewModel。查看documentaion 中的示例

    这是我使用的示例

    abstract class BaseFragment<T : ViewModel> : Fragment() {
         abstract val viewModel: T
         ......
    }
    
    @AndroidEntryPoint
    class MyFragment: BaseFragment<MyViewModel>() {
        override val viewModel: MyViewModel by viewModels()
        .....
    }
    
    @HiltViewModel
    class MyViewModel
    @Inject constructor() : ViewModel() {
        ......
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-15
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多