当前需要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) 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) 我正在为活动及其所有片段使用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
我在 YouTube 上观看了一些教程项目,其中一些制作了 viewmodel 文件并编写了一些代码,只是为了使用 viewmodel!
我们有rememberand rememberSavableand stateand recomposition
and ... 在 jetpack 中组成。那么为什么还有人使用 viewmodel 呢?!它有更多的代码,使我们初学者更难以理解该项目。
我猜他们几乎没学过 XML 的视图模型,而且他们不能就这么忘记它!
在jetpack compose中是否可以以我们不需要使用viewmodel的方式编写代码?
viewmodel android-viewmodel android-jetpack android-jetpack-compose
我正在使用 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)
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) 我想类似的设置UI测试GithubBrowserSample,它看起来像示例项目只有模仿ViewModel的Fragment,但不是一个例子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
我正在构建一个位置应用程序,我在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 …
我在使用时遇到问题,ViewModel而且LiveData我是使用ViewModel和LiveData arch组件的新手,并且在使用fragments和旋转屏幕时出现问题,观察者会被触发...我试图移动
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
在所有片段生命周期方法中但没有成功.
我的场景非常简单:
login(email, password)并设置LiveData对象的值在这一点上一切都好.但是当我旋转屏幕时,Toast再次出现而没有任何用户交互.
我是否必须在onDestroyView()中执行某些操作?
提前致谢!
android android-livedata android-viewmodel android-architecture-components
我的项目中有一个复杂的屏幕,我打破了多个片段.我正在尝试遵循这些类的MVVM架构,因此哪个片段有自己的ViewModelContract类.
问题是所有ViewModel都需要相同的对象实例(让我们称之为Book)来进行Room事务.
它是否有正确的方法LiveData在ViewModels之间共享数据(或)?我知道共享ViewModel的概念,但我不知道是否可以将它应用于此案例.我也想过使用,MediatorLiveData但也没有得到一个好的方法.
我正在考虑BookObservableProvider使用LiveData<Book>(或Rx Subject<Book>)一个类(让我们调用),其中每个ViewModel注入相同的实例并且加载/更新总是相同的值.
这是一个好方法吗?
使用 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
android ×9
android-architecture-components ×4
kotlin ×2
android-mvvm ×1
androidx ×1
mvvm ×1
searchview ×1
viewmodel ×1