AndroidXライブラリの更新情報を眺めていろいろ機能を触ったのでまとめたいと思います。
最近の定義は恣意的なのでご了承ください。
Navigation
deeplink
<deeplink>
タグによってUriを元にNavigationを開けるようになります。
dialog
<dialog>
タグにDialogFragmentを登録すれば、Navigationからダイアログを表示できます。
Room(SQLite)
コルーチン対応
room-ktx
がsuspendメソッドに対応しました。
@Query("SELECT * FROM Status where count = :count")
suspend fun find(count: Int): Status?
Lifecycle
ViewModelの初期化
以前はViewModelの取得では
private val viewModel by lazy { ViewModelProviders.of(this).get<MainViewModel>() }
と記述していましたが、ViewModelProvidersはDeprecatedになりました。
activity-ktx
やfragment-ktx
に追加されたactivityViewModels
やviewModels
で
private val activityViewModel: ActivityViewModel by activityViewModels()
private val fragmentViewModel: FragmentViewModel by viewModels()
と記述するようにします。
JavaからはViewModelProviderを直接使用して
MainViewModel viewModel = new ViewModelProvider(getViewModelStore(), getDefaultViewModelProviderFactory()).get(MainViewModel.class);
という感じです。
ViewModelに引数を渡したい場合はViewModelProvider.NewInstanceFactory
を継承して
class YearMonthViewModel(val yearMonth: YearMonth) : ViewModel() {
class Factory(private val yearMonth: YearMonth) : ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass != YearMonthViewModel::class.java)
return super.create(modelClass)
@Suppress("UNCHECKED_CAST")
return YearMonthViewModel(yearMonth) as T
}
}
}
private val viewModel: YearMonthViewModel by viewModels {
YearMonthViewModel.Factory(YearMonthFragmentArgs.fromBundle(requireArguments()).yearMonth)
}
というようにFactoryクラスを使って初期化します。
ViewModel.viewModelScope
viewmodel-ktx 2.1.0で導入されるviewModelScopeを使えばCoroutineScopeを実装しなくてよくなる
上記の記事のとおりです。
ViewModelでコルーチンが使いやすくなります。
2.2.0ではlifecycleScope
も追加されてFragmentなどからも使えます。
LiveData-ktx
val time: MutableLiveData<LocalTime> = MutableLiveData()
val timeText = Transformations.map(time) { it.format(DateTimeFormatter.ISO_LOCAL_DATE) }
val timeText2 = time.map { it.format(DateTimeFormatter.ISO_LOCAL_DATE) }
timeText2のようにTransformationsを使わず、LiveDataに直接map
を行うようなラッパーがlivedata-ktxに追加されました。地味に可読性が向上します。