在相同的情况下,当我调用对象的observe
方法时,Android Studio 会显示警告消息LiveData
viewModel.emailValidationResult.observe(viewLifecycleOwner, {onEmailChanged(it)})
Run Code Online (Sandbox Code Playgroud)
候选解析将很快更改,请使用完全限定名称明确调用以下更接近的候选:
public open fun observe(owner: LifecycleOwner,observer: Observer<in Int?>): androidx.lifecycle.LiveData中定义的单元
据我了解,这是在更新 kotlin 1.4 之后发生的, 这实际上是什么意思?
它看起来MutableLiveData
不同于LiveData
仅将the setValue()
和postValue()
方法公开,而在LiveData
它们受到保护的情况下.
为这种变化创建一个单独的类的原因是什么,而不是简单地将这些方法定义为公共的LiveData
?
一般来说,这种继承形式(增加某些方法的可见性是唯一的变化)是一种众所周知的做法,以及它可能有用的一些场景(假设我们可以访问所有代码)?
oop android android-livedata android-architecture-components
我有一些关于Kotlin Flow 的问题
LiveData
从多个 Fragment观察。我可以这样做Flow
吗?如果是,那么如何?LiveData
从单个中获得多个。有没有办法从一个来源获得多个?LiveData
map
switchMap
Flow
Flow
MutableLiveData
I 可以使用变量引用从任何地方更新数据。有什么办法可以做同样的事情Flow
吗?我有一个用例,例如:我将观察一个SharedPreferences
using callbackFlow{...}
,它会给我一个单一的源 Flow。从那个 Flow 中,我想为每个键值对创建多个 Flow。
这些可能听起来很愚蠢的问题。我是 Rx 和 Flow 世界的新手。
android kotlin android-livedata kotlin-coroutines kotlin-flow
简短的问题:
使用使用页面大小加载新页面和BoundaryCallback
类的API,从Architecture组件处理Paging库上的数据库+网络的正确方法是什么?
研究和解释
目前,BoundaryCallback
在用于体系结构组件的分页库中使用的类接收列表中元素的实例作为参数,而没有该元素所在的实际上下文.它发生在onItemAtFrontLoaded
和onItemAtEndLoaded
.
我的Api应该接收页面和页面大小以加载下一个数据块.作为分页列表构建器的一部分添加的边界回调应该告诉您何时根据预取距离和页面大小加载下一页数据.
由于API需要的页码和页面提供的尺寸,我看不到的方式发送到API只是通过接收从列表中提供的元素之一onItemAtFrontLoaded
和onItemAtEndLoaded
.检查此链接中的google示例,他们使用最后一个元素的名称来获取下一个元素,但这不适合具有页面+大小的Api.
他们还有另一个只使用网络的例子PagedKeyedDatasource
,但没有关于如何将它与数据库和BoundaryCallback混合的样本或线索.
编辑:到目前为止我找到的解决方案只是将最后加载的页面存储在共享首选项上,但这听起来像是一个肮脏的技巧.
有关官方输入,请参阅 https://github.com/googlesamples/android-architecture-components/issues/252#issuecomment-392119468.
android android-room android-livedata android-architecture-components android-paging
有两种方法可以改变价值MutableLiveData
.但是,什么是区别setValue()
与postValue()
在MutableLiveData
.
我找不到相同的文档.
这是MutableLiveData
Android 类.
package android.arch.lifecycle;
/**
* {@link LiveData} which publicly exposes {@link #setValue(T)} and {@link #postValue(T)} method.
*
* @param <T> The type of data hold by this instance
*/
@SuppressWarnings("WeakerAccess")
public class MutableLiveData<T> extends LiveData<T> {
@Override
public void postValue(T value) {
super.postValue(value);
}
@Override
public void setValue(T value) {
super.setValue(value);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们.现在我想将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从我的数据获取类返回的LiveData对象.observe方法需要一个LifecycleOwner对象作为第一个参数,但我显然没有在我的ViewModel内部,我知道我不应该保持对ViewModel内部的Activity/Fragment的引用.我该怎么办?
android android-livedata android-viewmodel android-architecture-components
我搜索了很多但没有找到问题的清晰答案:
MediatorLiveData和MutableLiveData有什么区别?
使用其中任何一种的合适条件是什么.
我有一个片段:
class MyFragment : BaseFragment() {
// my StudentsViewModel instance
lateinit var viewModel: StudentsViewModel
override fun onCreateView(...){
...
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProviders.of(this).get(StudentsViewModel::class.java)
updateStudentList()
}
fun updateStudentList() {
// Compiler error on 'this': Use viewLifecycleOwner as the LifecycleOwner
viewModel.students.observe(this, Observer {
//TODO: populate recycler view
})
}
}
Run Code Online (Sandbox Code Playgroud)
在我的片段中,我有一个 StudentsViewModel 的实例,它在onViewCreated(...)
.
在,StudentsViewModel
,students
是一个LiveData
:
class StudentsViewModel : ViewModel() {
val students = liveData(Dispatchers.IO) {
...
} …
Run Code Online (Sandbox Code Playgroud) android android-fragments android-livedata android-viewmodel
LiveData类的这两个方法有什么区别?官方文档和教程对此非常模糊.在map()方法中,第一个参数叫做source,但在switchMap()中它调用了trigger.这背后的理由是什么?
我的理解LiveData
是,它将触发观察者对当前状态变化的数据,而不是一系列历史状态变化的数据.
目前,我有一个MainFragment
执行Room
写操作的程序,用于将非删除数据更改为已删除的数据.
我也是另一个TrashFragment
观察到破坏数据的人.
请考虑以下情形.
MainFragment
是当前活动的片段.TrashFragment
尚未创建.MainFragment
添加了1个已删除的数据.MainFragment
用TrashFragment
.TrashFragment
的观察者将首先收到onChanged
0个已删除的数据TrashFragment
观察者将接下来接收onChanged
1个已删除的数据 我的期望是,第(6)项不应该发生.TrashFragment
应该只接收最新的已删除数据,即1.
这是我的代码
public class TrashFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
noteViewModel = ViewModelProviders.of(getActivity()).get(NoteViewModel.class);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { …
Run Code Online (Sandbox Code Playgroud) android ×10
android-livedata ×10
android-architecture-components ×5
kotlin ×2
android-room ×1
kotlin-flow ×1
oop ×1