如何使用 launchFragmentInHiltContainer 将视图模型传递给片段
How to pass viewmodel to fragment using launchFragmentInHiltContainer
我正在尝试为我的片段编写一个测试用例。片段看起来像这样,
@AndroidEntryPoint
class MainFragment : BaseFragment() {
val viewModel: HomeFragmentViewModel by viewModels()
......
}
现在在我的测试中 class,
@RunWith(AndroidJUnit4::class)
@LargeTest
@HiltAndroidTest
@ExperimentalCoroutinesApi
class MainFragmentTest {
@get:Rule
var hiltRule = HiltAndroidRule(this)
@Before
fun init() {
hiltRule.inject()
}
@Test
fun testFragmentDisplays() {
val fakeRepository = FakeRepository()
val scenerio = launchFragmentInHiltContainer<MainFragment>() {
//(this as MainFragment).viewModel = HomeFragmentViewModel(fakeRepository)
}
}
}
问题是片段中的 viewModel 是 val
,它必须是 val
,因为我正在使用 viewModels()
创建视图模型。无论如何我可以创建视图模型并在我的片段中使用吗?
提前致谢。
像这样制作你的 BaseFragment
abstract class BaseFragment<VM: ViewModel>: Fragment() {
protected lateinit var viewModel: VM
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this).get(getViewModelClass())
.....
}
}
然后像这样扩展它
@AndroidEntryPoint
class MainFragment : BaseFragment<HomeFragmentViewModel>() {
......
}
而HomeFragmentViewModel
应该是这样的
@HiltViewModel
class HomeFragmentViewModel @Inject constructor(
private val YourRepository: YourRepository
) : ViewModel() {
........
}
我正在尝试为我的片段编写一个测试用例。片段看起来像这样,
@AndroidEntryPoint
class MainFragment : BaseFragment() {
val viewModel: HomeFragmentViewModel by viewModels()
......
}
现在在我的测试中 class,
@RunWith(AndroidJUnit4::class)
@LargeTest
@HiltAndroidTest
@ExperimentalCoroutinesApi
class MainFragmentTest {
@get:Rule
var hiltRule = HiltAndroidRule(this)
@Before
fun init() {
hiltRule.inject()
}
@Test
fun testFragmentDisplays() {
val fakeRepository = FakeRepository()
val scenerio = launchFragmentInHiltContainer<MainFragment>() {
//(this as MainFragment).viewModel = HomeFragmentViewModel(fakeRepository)
}
}
}
问题是片段中的 viewModel 是 val
,它必须是 val
,因为我正在使用 viewModels()
创建视图模型。无论如何我可以创建视图模型并在我的片段中使用吗?
提前致谢。
像这样制作你的 BaseFragment
abstract class BaseFragment<VM: ViewModel>: Fragment() {
protected lateinit var viewModel: VM
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this).get(getViewModelClass())
.....
}
}
然后像这样扩展它
@AndroidEntryPoint
class MainFragment : BaseFragment<HomeFragmentViewModel>() {
......
}
而HomeFragmentViewModel
应该是这样的
@HiltViewModel
class HomeFragmentViewModel @Inject constructor(
private val YourRepository: YourRepository
) : ViewModel() {
........
}