标签: android-viewmodel

为什么 Android viewModels() 扩展函数在fragment-ktx而不是viewmodel-ktx库中可用?

viewModels()当我如下使用时

class MainActivity : AppCompatActivity() {

    private val viewModel: MainViewModel by viewModels()

    // ... more codes
}
Run Code Online (Sandbox Code Playgroud)

为什么它可以在

implementation 'androidx.fragment:fragment-ktx:1.3.0'
Run Code Online (Sandbox Code Playgroud)

相反,当我包含如下内容时,它们在其中不可用?

implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
Run Code Online (Sandbox Code Playgroud)

我以为它应该在viewmodel-ktx图书馆而不是fragment-ktx图书馆

android kotlin android-gradle-plugin android-viewmodel

1
推荐指数
1
解决办法
1359
查看次数

实现 Paging Library 3.0 过滤/搜索功能

使用paging 3.0,我成功地实现了它。现在我想为其添加搜索功能。

我只是显示照片库以及分页功能。现在我想在有人搜索时使分页无效

但每当我在搜索上调用无效时。应用程序崩溃..

照片片段.kt

@AndroidEntryPoint
class PhotosFragment : BaseFragment<FragmentPhotosBinding,PhotosFragmentViewModel>(R.layout.fragment_photos),
    SearchView.OnQueryTextListener, LifecycleObserver {
    override val mViewModel: PhotosFragmentViewModel by viewModels()

    private lateinit var photoAdapter: PhotoCollectionAdapter

    override fun onAttach(context: Context) {
        super.onAttach(context)
        activity?.lifecycle?.addObserver(this)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setHasOptionsMenu(true)
        ///mViewModel.setFilter(getString(R.string.search_filter_default_value))
        initAdapter()
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreated(){
        mViewModel.trendingPhotos.observe(viewLifecycleOwner, Observer {
            photoAdapter.submitData(lifecycle,it)
        })
    }

    private fun initAdapter() {
        photoAdapter = PhotoCollectionAdapter()
        photoAdapter.stateRestorationPolicy = RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY

        mBinding.recyclerView.apply {
            layoutManager = LinearLayoutManager(context)
            setHasFixedSize(true)
            adapter = photoAdapter
        }

        photoAdapter.addLoadStateListener { loadState -> …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-viewmodel android-paging android-paging-3

1
推荐指数
1
解决办法
4901
查看次数

无法创建AndroidViewModel的实例

我正在尝试在应用程序中实现架构组件,但我在创建androidViewModel实例时面临一个问题.请帮我解决这个问题.

这里我试图创建一个LoginViewModel类的实例,但得到下面提到的错误

错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.addonitservices.uphaar, PID: 22975
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.addonitservices.uphaar/com.addonitservices.uphaar.login.LoginActivity}: java.lang.RuntimeException: Cannot create an instance of class com.addonitservices.uphaar.login.LoginViewModel
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.RuntimeException: Cannot create an instance of class com.addonitservices.uphaar.login.LoginViewModel
        at android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:201)
        at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
        at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
        at com.addonitservices.uphaar.login.LoginActivity.initViewModel(LoginActivity.kt:27)
        at com.addonitservices.uphaar.login.LoginActivity.onCreate(LoginActivity.kt:22)
        at android.app.Activity.performCreate(Activity.java:6999)
        at android.app.Activity.performCreate(Activity.java:6990)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) …
Run Code Online (Sandbox Code Playgroud)

android mvvm kotlin android-viewmodel android-architecture-components

0
推荐指数
1
解决办法
2012
查看次数

Android数据绑定和LiveData:无法绑定到LiveData属性中的值

我正在尝试对应该显示通过ViewModel中的LiveData属性公开的数据的视图进行数据绑定,但是我没有找到将LiveData中的对象绑定到视图的方法。从XML中,我只能访问LiveData实例的value属性,而不能访问其中的对象。我错过了什么吗?

我的ViewModel:

class TaskViewModel @Inject
internal constructor(private val taskInteractor: taskInteractor)
    : ViewModel(), TaskContract.ViewModel {

    override val selected = MutableLiveData<Task>()
    val task: LiveData<Task> = Transformations.switchMap(
        selected
    ) { item ->
        taskInteractor
            .getTaskLiveData(item.task.UID)
    }
    ... left out for breivety ... 
}
Run Code Online (Sandbox Code Playgroud)

我试图将任务对象的值绑定到我的视图中,但是当尝试在我的视图中设置任务的值时,我只能这样做android:text="@={viewmodel.task.value}"。我无权访问任务对象的字段。在LiveData对象中提取对象值的诀窍是什么?

我的任务课:

@Entity(tableName = "tasks")
data class Task(val id: String, 
                val title: String, 
                val description: String?, 
                created: Date, 
                updated: Date, 
                assigned: String?)
Run Code Online (Sandbox Code Playgroud)

android android-databinding android-livedata android-viewmodel

0
推荐指数
2
解决办法
1274
查看次数

Kotlin ViewModel类中需要的属性获取器或设置器

我有以下ViewModel类:

class PersonViewModel(
        context: Application,
        private val dataSource: MoviesRemoteDataSource)
    : AndroidViewModel(context) {

    internal val compositeDisposable = CompositeDisposable()
    val person: ObservableField<Person>()
    private val isVisible = ObservableBoolean(false)

    fun showPerson(personId: String) {
        val personSubscription = dataSource.getPerson(personId)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ person ->
                    isVisible.set(true)
                    this.person.set(person)
                }
                ) { throwable -> Timber.e(throwable) }

        compositeDisposable.add(personSubscription)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是Person类:

class Person(
        @SerializedName("birthday")
        var birthDay: String?,
        @SerializedName("deathday")
        var deathDay: String?,
        var id: Int,
        @SerializedName("also_known_as")
        var alsoKnowAs: List<String>,
        var biography: String,
        @SerializedName("place_of_birth")
        var placeOfBirth: String?)
Run Code Online (Sandbox Code Playgroud)

它在ViewModel的这一行显示错误:

val person: ObservableField<Person>()
Run Code Online (Sandbox Code Playgroud)

它说 …

android kotlin android-viewmodel

0
推荐指数
1
解决办法
662
查看次数

通过视图模型在片段之间共享数据

根据https://developer.android.com/topic/libraries/architecture/viewmodel 上的“片段之间共享数据”部分,我们被告知在活动范围内创建一个 ViewModel 并在片段之间共享是要走的路.

这是在 ViewModel 中设置值的 Fragment

class MasterFragment : Fragment() {

    private lateinit var itemSelector: Selector

    private lateinit var model: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        model = activity?.run {
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
        itemSelector.setOnClickListener { item ->
            // Update the UI
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是使用属性集的细节片段

class DetailFragment : Fragment() {

    private lateinit var model: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        model = activity?.run {
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
        model.selected.observe(this, …
Run Code Online (Sandbox Code Playgroud)

android android-viewmodel android-jetpack

0
推荐指数
1
解决办法
4921
查看次数

如何在活动之间共享 viewModel?

我现在正在学习 Android ViewModel。我有 MainActivity 和 RegisterActivity ,它们可以在其中输入姓名、年龄和电话号码。在 RegisterActivity 中输入该信息后,我将该信息放入 ViewModel 并单击一个按钮并完成 RegisterActivity。问题是,我想在 MainActivity 中显示信息。那么如何在两个活动之间共享 viewModel 呢?我必须使用什么概念?

android android-databinding android-viewmodel

0
推荐指数
1
解决办法
437
查看次数

Savedstateviewmodelfactory是final的,不能继承

class SettingsViewModelFactory(application: Application, owner: SavedStateRegistryOwner) : SavedStateViewModelFactory(application, owner){


    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(SettingsViewModel::class.java)){
            return SettingsViewModel() as T
        }
        throw IllegalArgumentException("Invalid ViewModel class")
    }

}
Run Code Online (Sandbox Code Playgroud)

我在 SavedStateViewModelFactory 下方看到一条红色下划线,表示该类型是最终类型,不能继承。我该怎么办?文档太模糊了。另外我要在退货中放入什么状态?

android kotlin android-viewmodel android-jetpack

0
推荐指数
1
解决办法
939
查看次数

如何从 ViewPager Fragment 获取作为 AndroidEntryPoint 的父 Fragment?

我在 ViewPager 中有一个片段,其创建如下:

companion object {

    fun newInstance(someData: SomeData): ViewPagerFragment {
        val f = ViewPagerFragment()
        val args = Bundle()
        args.putParcelable("someData", someData)
        f.arguments = args
        return f
    }
}
Run Code Online (Sandbox Code Playgroud)

它也是一个 Hilt 入口点,它创建自己的 ViewModel,但也需要父 Fragments ViewModel,因此该类的顶部如下所示:

@AndroidEntryPoint
class ViewPagerFragment : Fragment() {

    private val parentViewModel: ParentViewModel by viewModels(
        ownerProducer = { requireParentFragment() }
    )
    private val viewPagerViewModel: ViewPagerViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)

但是,找不到父 Fragment:

java.lang.IllegalStateException: Fragment ViewPagerFragment{b6d6157} 
(e5f3fc7d-2ae4-4275-9763-22826a9be939) id=0x7f09017e} is not a child Fragment, it is 
directly attached to 
dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper@1852444
Run Code Online (Sandbox Code Playgroud)

我认为发生这种情况是因为添加 viewPagerViewModel 后生成的 ViewPagerFragment …

android android-fragments android-viewpager android-viewmodel dagger-hilt

0
推荐指数
1
解决办法
1549
查看次数

如何在viewmodel中获取LazyRow的可见项

我在 jetpack compose 中创建了一个 LazyRow。在视图模型中的某个点,我想从该 LazyRow 获取当前可见项目的列表。我知道我可以使用以下代码获取 Composable 函数中可见项目的列表:

val listState = rememberLazyListState()
val visibleItemIds = remember {
    derivedStateOf { listState.layoutInfo.visibleItemsInfo.map { it.key.toString() } }
}
Run Code Online (Sandbox Code Playgroud)

问题是如何在视图模型事件期间将此数据传递到视图模型(而不是单击按钮等)

android android-viewmodel android-jetpack-compose android-jetpack-compose-lazy-column

0
推荐指数
1
解决办法
639
查看次数

我应该如何在两个片段中使用 ViewModel?

我有一个包含一个活动和两个片段的应用程序,在第一个片段中,我应该能够将数据插入数据库,在第二个片段中,我应该能够在 recyclerView 中看到添加的项目。

所以我制作了数据库、我的 RecyclerView 适配器和 ViewModel,

现在的问题是我应该如何管理这一切?

我应该在活动中初始化 ViewModel 并从片段中以某种方式调用它以使用插入吗?

我应该在两个片段中初始化视图模型两次吗?

我的代码如下所示:

让我们假设我在我的 Activity 中初始化了 viewholder:

class MainActivity : AppCompatActivity() {
     private val articoliViewModel: ArticoliViewModel by viewModels {
        ArticoliViewModelFactory((application as ArticoliApplication).repository)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我的 FirstFragments 方法,我应该使用 viewModel 将数据添加到数据库中,如下所示:

class FirstFragment : Fragment() {
    private val articoliViewModel: ArticoliViewModel by activityViewModels()
    private fun addArticolo(barcode: String, qta: Int) { // function which add should add items on click
      // here i should be able to do something like this

        articoliViewModel.insert(Articolo(barcode, qta))
    } …
Run Code Online (Sandbox Code Playgroud)

android android-fragments kotlin android-viewmodel

-1
推荐指数
1
解决办法
188
查看次数