【问题标题】:How to implement by viewModels?如何通过 viewModels 实现?
【发布时间】:2020-03-04 14:33:53
【问题描述】:

我一直在尝试实现 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
}

fragViewModel

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 中有一个错误显示在 by viewModels 中。那么错误是什么。 如果有人想要代码,请告诉我,我将在 Github 上传它

build.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"


}

【问题讨论】:

  • 您在问我们“错误是什么”,但您是能看到它的人,而不是我们。你能发布错误的内容吗?我的猜测是您在 build.gradle 文件中缺少 Ktx Fragments 依赖项。
  • 我已经更新了
  • 并在我的问题中添加了依赖项,请告诉我缺少什么
  • 您仍然缺少 Fragments Ktx 库,它是带有by viewModels 的库。 implementation "androidx.fragment:fragment-ktx:1.2.2"
  • 我会应用它并让你知道

标签: android kotlin viewmodel


【解决方案1】:

由于您正在使用另外一个片段 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>()

【讨论】:

    【解决方案2】:

    首先添加以下依赖使用viewModels(),(最新版本)

    implementation("androidx.navigation:navigation-fragment-ktx:$nav_version")
    implementation("androidx.navigation:navigation-ui-ktx:$nav_version")
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    

    然后你可以在你的片段中使用

    private val yourViewModel: YourViewModel by viewModels { // scope is this fragment      
     YourViewModelFactory(YourRepository(YourItemDatabase.invoke(requireContext())))
    }
    

    或者

    private val yourViewModel: YourViewModel by activityViewModels()// scope is it's activity
    

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 2019-11-06
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 2021-11-08
      相关资源
      最近更新 更多