标签: android-viewmodel

我应该在ViewModel中包括LifecycleOwner吗?

当前需要LifecycleOwner才能使我创建观察者。

我有在ViewModel中创建一个Observer的代码,因此在我的Fragment中检索ViewModel时附加了LifecycleOwner。

根据Google的文档。

警告:ViewModel绝不能引用视图,生命周期或任何可能包含对活动上下文的引用的类。

我是否打破了警告,如果这样做了,您建议我采用哪种方式移动我创建的观察者以返回数据?

我只是做一个观察者,所以我想知道它是否仍然有效。由于在谷歌的文档中也有提及。

ViewModel对象可以包含LifecycleObservers,例如LiveData对象。

主片段

private lateinit var model: MainViewModel

/**
 * Observer for our ViewModel IpAddress LiveData value.
 * @see Observer.onChanged
 * */
private val ipObserver = Observer<String> {
    textIp.text = it
    hideProgressBar()
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    model = ViewModelProviders.of(this).get(MainViewModel::class.java)
    model.attach(this)
}

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? =
        inflater?.inflate(R.layout.fragment_main, container, false)

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    buttonRetrieveIp.setOnClickListener {
        showProgressBar()
        model.fetchMyIp().observe(this, ipObserver) //Here we attach our …
Run Code Online (Sandbox Code Playgroud)

android mvvm android-viewmodel

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

在Fragment的附加ViewModel上没有调用onCleared

ViewModel.OnCleared()当应用程序进入后台时(即使Don't keep activities已启用),当我没有被调用时,我偶然发现了一个问题,但我可以看到Fragment.onDestroy()实际上正在调用它.

以下代码可能有什么问题?如何ViewModel.OnCleared()在这种情况下实际调用?

视图模型:

class ViewModelFirst(application: Application) : AndroidViewModel(application) {

    companion object {
        private const val TAG = "ViewModelFirst"
    }

    init {
        Log.v(TAG, "Created")
    }

    override fun onCleared() {
        super.onCleared()
        Log.v(TAG, "onCleared")
    }
}
Run Code Online (Sandbox Code Playgroud)

分段:

class FragmentFirst : Fragment() {

    companion object {
        private const val TAG = "FragmentFirst"
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        ViewModelProviders.of(this).get(ViewModelFirst::class.java)

        return inflater.inflate(R.layout.fragment_first, container, false)
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.v(TAG, …
Run Code Online (Sandbox Code Playgroud)

android android-viewmodel android-architecture-components

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

如何通过viewModels获取viewModel?(片段-ktx)

我正在为活动及其所有片段使用Single viewModel。

因此要初始化viewmodel是否必须在onActivityCreated所有片段的

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(activity!!).get(NoteViewModel::class.java)
    }
Run Code Online (Sandbox Code Playgroud)

我正在浏览Android KTX扩展页面:(请参阅此处

我发现我可以像这样初始化视图模型:

    // 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>()
Run Code Online (Sandbox Code Playgroud)

所以我在gradle(app)中添加了以下依赖项:

    //ktx android
    implementation 'androidx.core:core-ktx:1.0.2'
    implementation 'androidx.fragment:fragment-ktx:1.0.0'
    implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试viewModels/activityViewModels在我的应用程序中使用它们的引用时,找不到。

我需要有关如何使用这些扩展名的一些基本示例的帮助,我尝试搜索一些未找到的示例。

android kotlin-android-extensions android-viewmodel android-jetpack androidx

9
推荐指数
4
解决办法
2354
查看次数

为什么有些人仍然在 jetpack compose 中使用 viewmodel?

我在 YouTube 上观看了一些教程项目,其中一些制作了 viewmodel 文件并编写了一些代码,只是为了使用 viewmodel!

我们有rememberand rememberSavableand stateand recomposition and ... 在 jetpack 中组成。那么为什么还有人使用 viewmodel 呢?!它有更多的代码,使我们初学者更难以理解该项目。

我猜他们几乎没学过 XML 的视图模型,而且他们不能就这么忘记它!

在jetpack compose中是否可以以我们不需要使用viewmodel的方式编写代码?

viewmodel android-viewmodel android-jetpack android-jetpack-compose

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

抑制:kotlinx.coroutines.DiagnosticCoroutineContextException:

我正在使用 jetpack compose 制作一个待办事项应用程序,我可以添加待办事项,但是当从数据库获取它们时,我收到了与 Courtine 相关的错误,但我无法得到,我需要帮助,谢谢

  • 获取数据时抛出错误
       Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@4c0bd0e, androidx.compose.ui.platform.MotionDurationScaleImpl@67ef32f, StandaloneCoroutine{Cancelling}@7800d3c, AndroidUiDispatcher@df61ac5]

Run Code Online (Sandbox Code Playgroud)
  • ViewModel获取数据方法
     fun showTasks() = viewModelScope.launch {
        try {
            dataState = dataState.copy(loading = true)
            todoRepository.getTasks().collectLatest {
                dataState = if(it != null){
                    dataState.copy(data = it)
                } else {
                    dataState.copy(error = "List is empty ...")
                }
            }
        }catch (ex  : Exception){
             dataState = dataState.copy(error = ex.localizedMessage)
        } finally {
             dataState = dataState.copy(loading = false)
        }
    }

Run Code Online (Sandbox Code Playgroud)
  • 在屏幕上显示数据
   @Composable
fun HomeScreen(navController: NavController,
               todoViewModel: TodoViewModel = hiltViewModel()
) {

    val state = …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-viewmodel android-jetpack-compose

9
推荐指数
0
解决办法
3268
查看次数

Android架构组件ViewModel - 如何在测试Activity上模拟ViewModel?

我想类似的设置UI测试GithubBrowserSample,它看起来像示例项目只有模仿ViewModelFragment,但不是一个例子Activity.

这是我的代码,我试图Activity通过嘲笑来测试ViewModel.但是在Activity ViewModel之前没有设置好onCreate().

@RunWith(AndroidJUnit4::class)
class MainActivityTest {

    val viewModel = mock(MainViewModel::class.java)

    @Rule
    @JvmField
    val activityRule = ActivityTestRule<MainActivity>(MainActivity::class.java, true, true)

    private val liveData = MutableLiveData<Resource<Object>>()

    @Before
    open fun setUp() {
        activityRule.activity.viewModelFactory = createViewModelFor(viewModel)
        `when`(viewModel.liveData).thenReturn(liveData)
        viewModel.liveData?.observeForever(mock(Observer::class.java) as Observer<Resource<Object>>)
        liveData.postValue(Resource.success(Object()))
    }

    fun <T : ViewModel> createViewModelFor(model: T): ViewModelProvider.Factory =
        object : ViewModelProvider.Factory {
            override fun <T : ViewModel> create(modelClass: Class<T>): T {
                if (modelClass.isAssignableFrom(model.javaClass)) {
                    return model as …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-espresso android-viewmodel android-architecture-components

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

获取Activity或Fragment之外的ViewModel实例的正确方法

我正在构建一个位置应用程序,我在MainActivity中的Room数据库中显示背景位置.我可以通过调用获得ViewModel

locationViewModel = ViewModelProviders.of(this).get(LocationViewModel.class);
locationViewModel.getLocations().observe(this, this);
Run Code Online (Sandbox Code Playgroud)

当我通过BroadCastReceiver接收位置更新时,应将定期背景位置保存到会议室数据库.他们应该通过电话保存locationViewModel.getLocations().setValue()

public class LocationUpdatesBroadcastReceiver extends BroadcastReceiver {

    static final String ACTION_PROCESS_UPDATES =
            "com.google.android.gms.location.sample.backgroundlocationupdates.action" +
                    ".PROCESS_UPDATES";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            if (ACTION_PROCESS_UPDATES.equals(action)) {
                LocationResult result = LocationResult.extractResult(intent);
                if (result != null) {
                    List<Location> locations = result.getLocations();
                    List<SavedLocation> locationsToSave = covertToSavedLocations(locations)
                    //Need an instance of LocationViewModel to call locationViewModel.getLocations().setValue(locationsToSave)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我应该如何在像这个BroadcastReceiver这样的非活动类中获取LocationViewModel实例?调用locationViewModel = ViewModelProviders.of(context).get(LocationViewModel.class)上下文是我从onReceive (Context …

android android-viewmodel android-architecture-components

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

屏幕旋转后,Android Arch Components ViewModel和LiveData触发器

我在使用时遇到问题,ViewModel而且LiveData我是使用ViewModel和LiveData arch组件的新手,并且在使用fragments和旋转屏幕时出现问题,观察者会被触发...我试图移动

viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) 在所有片段生命周期方法中但没有成功.

我的场景非常简单:

  1. 登录屏幕上有电子邮件和密码
  2. 用户点击"登录"按钮
  3. viewmodel调用login(email, password)并设置LiveData对象的值
  4. 只是为了现在简单的展示吐司

在这一点上一切都好.但是当我旋转屏幕时,Toast再次出现而没有任何用户交互.

我是否必须在onDestroyView()中执行某些操作?

提前致谢!

android android-livedata android-viewmodel android-architecture-components

8
推荐指数
2
解决办法
2452
查看次数

在ViewModels之间共享数据

我的项目中有一个复杂的屏幕,我打破了多个片段.我正在尝试遵循这些类的MVVM架构,因此哪个片段有自己的ViewModelContract类.

问题是所有ViewModel都需要相同的对象实例(让我们称之为Book)来进行Room事务.

它是否有正确的方法LiveData在ViewModels之间共享数据(或)?我知道共享ViewModel的概念,但我不知道是否可以将它应用于此案例.我也想过使用,MediatorLiveData但也没有得到一个好的方法.

我正在考虑BookObservableProvider使用LiveData<Book>(或Rx Subject<Book>)一个类(让我们调用),其中每个ViewModel注入相同的实例并且加载/更新总是相同的值.

这是一个好方法吗?

android android-mvvm android-livedata android-viewmodel

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

通过观察ViewModel在RecyclerView中搜索PagedList的LiveData

使用 android Paging 库,可以很容易地从数据库中分块加载数据,并且 ViewModel 提供自动 UI 更新和数据保存。所有这些框架模块帮助我们在 Android 平台上创建一个出色的应用程序。

典型的 Android 应用程序必须显示项目列表并允许用户搜索该列表。这就是我想通过我的应用程序实现的目标。所以我通过阅读很多文档、教程甚至stackoverflow的答案来完成了一个实现。但我不太确定我是否做得正确或者我应该如何做。下面,我展示了使用 ViewModel 和 RecyclerView 实现分页库的方法。

请检查我的实施并纠正我的错误或告诉我应该如何做。我认为有许多像我一样的新 Android 开发人员仍然对如何正确执行此操作感到困惑,因为没有单一来源可以回答您关于此类实现的所有问题。

我只展示我认为重要的东西。我正在使用房间。这是我正在使用的实体。

@Entity(tableName = "event")
public class Event {
    @PrimaryKey(autoGenerate = true)
    public int id;

    public String title;
}
Run Code Online (Sandbox Code Playgroud)

这是事件实体的 DAO。

@Dao
public interface EventDao {
    @Query("SELECT * FROM event WHERE event.title LIKE :searchTerm")
    DataSource.Factory<Integer, Event> getFilteredEvent(String searchTerm);
}
Run Code Online (Sandbox Code Playgroud)

这是ViewModel扩展了AndroidViewModel ,它允许通过提供所有事件或根据搜索文本过滤的事件的LiveData< PagedList< Event>>来读取和搜索。我真的很挣扎,每次当filterEvent发生变化时,我都会创建新的LiveData,这可能是多余的或不好的。

private MutableLiveData<Event> filterEvent = new MutableLiveData<>();
private LiveData<PagedList<Event>> data;

private …
Run Code Online (Sandbox Code Playgroud)

android searchview android-recyclerview android-viewmodel android-paging

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