标签: android-viewmodel

具有多个参数的LiveData Transformations.map()

我在UI中有一个值,它的值取决于两个LiveData对象.想象一下你需要a subtotal = sum of all items price和a 的商店total = subtotal + shipment price.使用转换,我们可以对小计LiveData对象执行以下操作(因为它只依赖于itemsLiveData):

val itemsLiveData: LiveData<List<Items>> = ...
val subtotalLiveData = Transformations.map(itemsLiveData) { 
   items ->
       getSubtotalPrice(items)
}
Run Code Online (Sandbox Code Playgroud)

在总数的情况下,能够做这样的事情会很棒:

val shipPriceLiveData: LiveData<Int> = ...
val totalLiveData = Transformations.map(itemsLiveData, shipPriceLiveData) { 
   items, price ->
       getSubtotalPrice(items) + price
}
Run Code Online (Sandbox Code Playgroud)

但是,遗憾的是,这是不可能的,因为我们不能在map函数中放置多个参数.谁知道实现这个目标的好方法?

android android-livedata android-viewmodel

6
推荐指数
3
解决办法
2940
查看次数

ViewModel无法在Activity中实例化

我试图实例化一个ViewModel以在我的所有Activity中使用.

public class LaunchActivity extends Activity {
    private Controller control;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_launch);
         control = ViewModelProviders.of(this).get(Controller.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

但在我得到一个错误control = ViewModelProviders.of(this) <--,指出它不能解析of(this),但是基于例如这里通过实施视图模型Android开发者; 一个扩展ViewModel的类应该能够在Activity上实例化,对不对?

如果我正在做的是错误的,我应该如何为我的Activity实例化一个ViewModel对象?我是否必须n使用Fragment 创建多个Activity(s),因为ViewModelProviders.of()只能使用Fragment?

android android-layout android-fragments android-viewmodel

6
推荐指数
4
解决办法
5339
查看次数

Android体系结构组件:同一视图模型的多个实例

我是Android Architecture Components的新手,并且已经阅读了教程。我对其中的部分感兴趣:

这样,您就可以拥有一个可以打开同一Activity或Fragment的许多不同实例但具有不同ViewModel信息的应用程序。假设我们扩展了Court-Counter示例,以获取多个篮球比赛的得分。游戏会显示在列表中,然后单击列表中的游戏会打开一个屏幕,该屏幕看起来像我们当前的MainActivity,但我将其称为GameScoreActivity。

假设我有一个ViewModel MyViewModel。我想创建此视图模型的列表,但是直到运行时我都不知道该列表中的元素数量。在for循环内创建视图模型实例是否方便?我可以创建多少个实例?实例数量会影响性能吗?

android android-viewmodel android-architecture-components

6
推荐指数
2
解决办法
2329
查看次数

无法创建ViewModel类的实例(无法启动活动ComponentInfo)

我在我的项目中使用MVVM,Retrofit,LiveData但我在看到这些链接之前得到了这个错误

错误

java.lang.RuntimeException:       
Unable to start activity ComponentInfo{ir.orangehat.movieinfo/ir.orangehat.movieinfo.application.home.HomeActivity}: java.lang.RuntimeException:

Cannot create an instance of class ir.orangehat.movieinfo.application.home.HomeViewModel
Run Code Online (Sandbox Code Playgroud)

这是我的ViewModel,我认为问题出在我的构造函数中

public class HomeViewModel extends AndroidViewModel {

private MovieRepository movieRepository;

public HomeViewModel(@NonNull Application application, Context context, LifecycleOwner lifecycleOwner) {
    super(application);
    movieRepository = new MovieRepository(lifecycleOwner, context);
}

LiveData<List<Movie>> getMovies() {
    return movieRepository.getMovies();
}}
Run Code Online (Sandbox Code Playgroud)

知识库

public class MovieRepository extends BaseRepository {

private LifecycleOwner lifecycleOwner;
private MovieApi movieApi;
private MovieDatabaseHelper movieDatabaseHelper;

public MovieRepository(LifecycleOwner lifecycleOwner, Context context) {
    this.lifecycleOwner = lifecycleOwner;
    movieApi = getRetrofitHelper().getService(MovieApi.class);
    movieDatabaseHelper = …
Run Code Online (Sandbox Code Playgroud)

android mvvm android-viewmodel android-architecture-components

6
推荐指数
2
解决办法
1万
查看次数

具有ViewModel和实时数据的ViewPager,所有6个标签数据都被最后一个标签数据替换

我对工作ViewPager有6个tabs地方只有一个片段TimesListFragment

根据传递给TimesListFragment它的参数调用api eg; 科学,技术,旅行等

我已经GithubBrowserSample为我的应用关注了Google的

我有TimesListFragment-> TimesViewModel->TimesRepository

有6个标签,当我点击api时,所有标签都显示相同的结果,如果最后一个 argument

StoriesPagerAdapter.kt

class StoriesPagerAdapter(fragmentManager: FragmentManager?)
    :FragmentStatePagerAdapter(fragmentManager){
    private val sections= arrayListOf("science","technology","business","world","movies","travel")
    override fun getItem(position: Int): Fragment {
        return TimesListFragment.newInstance(sections[position])
    }
    override fun getCount(): Int {
        return sections.size
    }
    override fun getPageTitle(position: Int): CharSequence? {
        return sections[position]
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:所有选项卡都显示travel参数数据

TimesViewModel

class TimesViewModel @Inject constructor(private val timesRepository: TimesRepository) :
        ViewModel() {
    lateinit var data: LiveData<Resource<TimesStoriesResponse>>
    fun fetchStories(section:String): LiveData<Resource<TimesStoriesResponse>> { …
Run Code Online (Sandbox Code Playgroud)

android android-viewpager android-livedata android-viewmodel

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

Lateinit 属性 viewModel 尚未初始化

viewModel用这一行进行了初始化,viewModel = (activity as NewsActivity).viewModel但是BreakingNewsFragment收到了以下错误。我该如何解决这个问题?感谢您的帮助

突发新闻片段

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.View
import com.example.simplenewsapp.R
import com.example.simplenewsapp.main.MainViewModel
import com.example.simplenewsapp.NewsActivity
import com.example.simplenewsapp.adapter.NewsRecyclerViewAdapter
import kotlinx.android.synthetic.main.fragment_breaking_news.*


class BreakingNewsFragment : Fragment(R.layout.fragment_breaking_news) {

    lateinit var viewModel: MainViewModel


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

        viewModel = (activity as NewsActivity).viewModel


         ....
Run Code Online (Sandbox Code Playgroud)

新闻活动

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import androidx.navigation.ui.setupWithNavController
import com.example.simplenewsapp.data.local.ArticleDatabase
import com.example.simplenewsapp.main.MainRepository
import com.example.simplenewsapp.main.MainViewModel
import com.example.simplenewsapp.main.MainViewModelProviderFactory
import kotlinx.android.synthetic.main.activity_news.*

class NewsActivity : AppCompatActivity() {

    lateinit var …
Run Code Online (Sandbox Code Playgroud)

android mvvm android-fragments kotlin android-viewmodel

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

通过视图模型和使用工厂创建视图模型之间的区别?

我正在研究ViewModel将其应用到MVVM设计模式中。

有一个使用方法by viemodels()和一个ViewModelProvider.Factory在视图模型创建中使用的方法。

by viewModels()创建一个ViewModel object.

ViewModelProvider.Factory还创建Viewmodel objects.

这两者有什么区别?

另外,在一些示例代码中,我看到注释中的代码3,其中使用了by viewModels()and factory。这是什么意思?

class WritingRoutineFragment : Fragment() {
    private val viewModel: WriteRoutineViewModel by viewModels() // 1
    private lateinit var viewModelFactory: WriteRoutineViewModelFactory

//  private val viewModel: WriteRoutineViewModel by viewModels(
//        factoryProducer = { viewModelFactory } // 3.What does this code mean?
//  )

    override fun onCreateView(inflater: LayoutInflater,
                              container: ViewGroup?,
                              savedInstanceState: Bundle?): View? { …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-mvvm android-viewmodel

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

观察 ViewModel 初始化中的 StateFlow 发射

我有一个视图模型,它接受初始ViewState对象并具有state可以收集的公共访问变量。

class MyViewModel<ViewState>(initialState: ViewState) : ViewModel() {
    val state: StateFlow<ViewState> = MutableStateFlow(initialState)
    val errorFlow: SharedFlow<String> = MutableSharedFlow()

    init {
        performNetworkCall()
    }

    private fun performNetworkCall() = viewModelScope.launch {
        Network.makeCall(
            "/someEndpoint",
            onSuccess = {
                (state as MutableStateFlow).tryEmit(<some new state>)
            },
            onError = {
                (errorFlow as MutableSharedFlow).tryEmit("network failure")
            }
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

从片段观察此状态时,我可以看到初始状态(例如正在加载),并在网络调用成功完成时收集更改(例如,到已加载状态)。

然而,我不知道如何观察我的发射ViewModelUnitTest。我使用 kotlin 涡轮机来测试我的状态和共享流的排放,但我只能观察在调用viewModel.state.test或后发生的排放viewModel.errorFlow.test

由于我无法引用viewModel.stateviewModel.errorFlow在初始化 ViewModel 之前,如何编写测试来验证我的初始化逻辑是否正确执行并根据模拟行为发出预期结果Network.makeCall- 无论是新的发射state还是errorFlow发射?

android kotlin android-viewmodel kotlin-coroutines kotlin-flow

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

架构组件库中的 viewModel() 和 hiltViewModel() 有什么区别?

据我所知,在使用 Jetpack Compose 和 Hilt 时,有两种创建/访问 viewModel 实例的方法;viewModel() 和 hiltViewModel()。我不明白应该使用哪个,因为它们似乎做同样的事情。viewModel() 的文档表明它会自动使用 Hilt 通过 @HiltViewModel 构建的视图模型。那么这两种实现之间到底有什么区别以及什么时候应该使用它们呢?

android dependency-injection viewmodel android-viewmodel dagger-hilt

6
推荐指数
0
解决办法
256
查看次数

Android 单元测试因 java.lang.IllegalArgumentException 失败:需要 INTERNET 权限

我正在尝试为我的应用程序设置单元测试。但我遇到了Segment的问题

这是我的测试课:

@RunWith(RobolectricTestRunner::class)
@Config(sdk = [Build.VERSION_CODES.O_MR1])
class LoginViewModelTest {
    private lateinit var viewModel: LoginViewModel

    @Mock
    private lateinit var authService: AuthService

    @Mock
    private lateinit var sharedPreferences: SharedPreferences

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        val mMyApplication = mock<Application>()
        viewModel = LoginViewModel(mMyApplication, sharedPreferences, authService)
    }

    @Test
    fun test_phone(){
        viewModel.isPhone.observeForTesting {
            val isPhone = LiveDataTestUtil.getValue(viewModel.isPhone) ?: 
                return@observeForTesting
           Assert.assertFalse(isPhone)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

失败并出现以下错误:

INTERNET permission is required.
java.lang.IllegalArgumentException: INTERNET permission is required.
    at com.segment.analytics.Analytics$Builder.<init>(Analytics.java:1068)
    at com.app.android.MyApplication.onCreate(MyApplication.kt:42)
Run Code Online (Sandbox Code Playgroud)

MyApplication 类正在初始化 Segment,如下所示:

override fun onCreate() {
val …
Run Code Online (Sandbox Code Playgroud)

android mockito robolectric android-viewmodel android-unit-testing

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