【发布时间】:2018-11-17 08:11:09
【问题描述】:
我正在使用在 Google I/O 2018 上展示的 android 导航,我似乎可以通过绑定到某个视图或使用 NavHost 从 Fragment 获取它来使用它。但我需要的是根据几个条件从我的第一个片段从 ViewModel 导航到另一个特定视图。对于ViewModel,我扩展AndroidViewModel,但我不明白下一步该怎么做。我无法将getApplication 转换为片段/活动,也无法使用NavHostFragment。我也不能只将导航绑定到onClickListener,因为startFragment 只包含一个ImageView。如何从ViewModel 导航?
class CaptionViewModel(app: Application) : AndroidViewModel(app) {
private val dealerProfile = DealerProfile(getApplication())
val TAG = "REGDEB"
fun start(){
if(dealerProfile.getOperatorId().isEmpty()){
if(dealerProfile.isFirstTimeLaunch()){
Log.d(TAG, "First Time Launch")
showTour()
}else{
showCodeFragment()
Log.d(TAG, "Show Code Fragment")
}
}
}
private fun showCodeFragment(){
//??
}
private fun showTour(){
//??
}
}
我的片段
class CaptionFragment : Fragment() {
private lateinit var viewModel: CaptionViewModel
private val navController by lazy { NavHostFragment.findNavController(this) }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
viewModel = ViewModelProviders.of(this).get(CaptionViewModel::class.java)
return inflater.inflate(R.layout.fragment_caption, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel.start()
}
}
我想在 ViewModel 中保留导航逻辑
【问题讨论】:
-
Navigation 库是一个主要的 UI 组件,您需要将 UI 逻辑保留在 UI 中,因此您需要在 Fragment/Activity 中执行导航
-
我将在那里加载一些后端负载,并根据它们知道去哪里。一定有办法做到这一点
-
然后您需要将这些选项作为状态传播到 UI 并在那里做出决定。 ViewModel 不应该对视图一无所知,因此它的架构方式只是将数据发送到将订阅其数据的某个视图。也许您正在寻找 ViewModel 可以主动更改 View 的架构。那将是一个 MVP 架构,演示者可以主动更改视图
-
尽管我尝试在 Fragment 类中进行导航,但出现了错误
FragmentManager is already executing transactions -
我同意@LeviAlbuquerque 所说的一切。还没有看到你的代码,但这可能是issue,它将在 alpha02 中修复
标签: android mvvm kotlin android-navigation android-jetpack