【发布时间】:2019-10-11 13:25:09
【问题描述】:
我正在尝试根据 MVVM 模式设置我的项目,并且我正在使用 Jetpack 的 Android 架构组件。
我有一个“splash”片段,在此期间发出 HTTP 请求,根据响应,用户将被导航到设置视图或主视图。
片段飞溅:
class FragmentSplash : Fragment()
{
private lateinit var viewModelSplash: ViewModelSplash
override fun onCreateView( inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle? ): View?
{
viewModelSplash = ViewModelProviders.of( this ).get( ViewModelSplash::class.java )
return inflater.inflate(com.host.myproject.R.layout.fragment_splash, container, false )
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
{
viewModelSplash.command.observe(this, Observer {
when( it ) // I know strings are bad :)
{
"NAVIGATE_TO_MAIN" -> Navigation.findNavController( view ).navigate( R.id.action_showConfirm )
"NAVIGATE_TO_" -> Navigation.findNavController( view ).navigate( R.id.action_showBase )
}
});
super.onViewCreated(view, savedInstanceState)
}
}
ViewModelSplash:
class ViewModelSplash : ViewModel()
{
private val _command = MutableLiveData<String>()
val command: LiveData<String>
get() = _command
init
{
Timer("fakeHTTPRequest", false).schedule(3500) {
onInitializationFinished( response )
}
}
private fun onInitializationFinished( response : Response )
{
if( response.ok )
_command.postValue( "NAVIGATE_TO_MAIN" )
else
_command.postValue( "NAVIGATE_TO_CONFIRM" )
}
}
我看到的问题是这样的:
-The FragmentSplash contains logic pattern the "when" statement
-The FragmentSplash is aware of other fragments
我试图了解实现这一点的正确方法是什么,因为到目前为止我看到的所有示例都在 ViewModel 更改可观察对象中的数据后调用 Fragment 中的导航器:
viewModelSplash.command.observe(this, Observer {
...
Navigation.findNavController( view ).navigate
...
我完全迷路了..不是这样
与“视图/逻辑的独立性”相矛盾?
我认为应该有某种路由器类,它从 ViewModel 获得通知,它需要在其他地方导航,这样视图就会完全干净。请问有什么建议可以从这里去吗?
【问题讨论】:
-
您找到合适的解决方案了吗?我也想知道。
-
Same here...Android 架构组件范例似乎在架构方面做得并不好...