android - 如何通过 viewModels 实现?
问题描述
我一直在尝试实现 LiveData 和 View Model。在这个应用程序中,屏幕上显示一个数字,我们可以加五或减一。现在早些时候我使用了viewModelProvider,但现在它已被弃用,我正在使用“by viewmodels”,但它显示了一个错误
fragOne.kt
class fragOne : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
var binding = DataBindingUtil.inflate<FragmentFragoneBinding>(
inflater,
R.layout.fragment_fragone,
container,
false
)
//viewModel = ViewModelProviders.of(this).get(fragViewModel::class.java)
// Create the observer which updates the UI.
val viewModel: fragViewModel by **viewModels()**
val nameObserver = Observer<Int> {
viewModel.num.value=it
}
// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
viewModel.num.observe(viewLifecycleOwner,nameObserver)
// setting on Click listener for add button
binding.add.setOnClickListener()
{
//updateNumber()
viewModel.num.setValue(viewModel.addFive())
}
// setting on on Click Listener for minus button
binding.minus.setOnClickListener()
{
viewModel.num.setValue(viewModel.minusOne())
//updateNumber()
}
return binding.root
}
// Always call the superclass so it can save the view hierarchy state
}
片段视图模型
import androidx.lifecycle.ViewModel
class fragViewModel:ViewModel()
{
val num: MutableLiveData<Int> by lazy {
MutableLiveData<Int>()
}
// Initializing num=0
init {
num .value= 0
}
// Functions to add five or subtract one
fun addFive():Int
{
var newNumber:Int?=num.value
return newNumber?.plus(5)?:0
}
fun minusOne():Int
{
var newNumber:Int?=num.value
return newNumber?.minus(1)?:0
}
}
在fragOne中, viewModels显示错误。那么错误是什么。如果有人想要代码,请告诉我,我将在 Github 上上传
构建.gradle
def lifecycle_version = "2.2.0"
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation "androidx.core:core-ktx:1.2.0"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
}
解决方案
由于您正在使用片段implementation "androidx.core:core-ktx:1.3.1"
并将其添加到您的build.gradle
implementation "androidx.fragment:fragment-ktx:1.2.5"
片段中的用法
// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()
// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()
推荐阅读
- excel - 查找、替换和计算多个值
- javascript - 每个页面都显示相同的内容?
- flutter - 在颤动的文本旁边显示图像
- node.js - 个人资料页面未经授权 (GET 401)
- python-3.x - KeyError:在使用 Naive 和 SVM 进行情感分析时字典中的“无关”
- c# - 从 .net 2.0 项目打开 .net 4.5 项目的 windows 形式时出现运行时错误
- codeigniter - 在控制器 Codigniter 2.2.6 中加载模型时出现问题
- javascript - 为什么我的手风琴在单击时不显示子选项卡?
- python - 遍历字典前辈
- c - 将头文件与共享库链接