我想在身份验证视图(登录)中使用以下组件:
我不知道如何将Repository类中的异步Retrofit调用接收到当前的ViewModel。
视图-> ViewModel->具有LiveData的存储库。
有人会想到一个例子吗?
答案 0 :(得分:5)
您可以按照以下步骤操作:
YourActivity.kt
n -> n
MyViewModel.kt
class YourActivity : AppCompatActivity() {
private val myViewModel by lazy {
return@lazy ViewModelProviders.of(this).get(MyViewModel::class.java) }
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onViewReady(savedInstanceState)
myViewModel.callApi() // You can do it anywhere, on button click etc..
observeResponseData() // observe it once in onCreate(), it'll respect your activity lifecycle
}
private fun observeResponseData() {
myViewModel.liveData.observe(this, Observer { data ->
// here will be your response
})
}
}
MyRepository.kt
class MyViewModel : ViewModel() {
val liveData = MutableLiveData<Your response type here>()
val myRepository = MyRepository()
fun callApi() {
myRepository.callMyRetrofitApi(liveData)
}
}
尝试这样设置。
希望有帮助!
答案 1 :(得分:1)
使用LiveData和Retrofit在MVVM中设计项目的最简单方法是在ViewModel类中使用LiveData,在Repository中使用Retrofit。
用通俗易懂的话来说,您可以从存储库中的ViewModel类和ViewModel类中获取数据,然后将这些数据传递给 MutableLiveData ,然后可以通过转换该MutableLiveData在您的视图中进行观察进入LiveData。
MainActivity.java
public class MainActivity extends AppCompatActivity {
private MainViewModel mainViewModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_instruction);
mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
mainViewModel.init();
mainViewModel.getModelLiveData().observe(this, new Observer<MainResponse>() {
@Override
public void onChanged(@Nullable MainResponse mainResponse) {
// Here you write logic which implements if the ViewModel data changes.
}}
});
}
}
MainViewModel(您的ViewModel)
public class MainViewModel extends ViewModel {
private MainRepo mainRepo;
private MutableLiveData<MainResponse> modelMutableLiveData = new MutableLiveData<>();
Disposable disposable;
public MainViewModel() {
}
public MainViewModel(MainRepo mainRepo) {
this.mainRepo = mainRepo;
}
public void init() {
modelMutableLiveData.setValue(mainRepo.callRetrofit().body());
}
public LiveData<MainResponse> getModelLiveData() {
return modelMutableLiveData;
}
}
MainRepository(您的存储库类)
public class MainRepository{
public void callRetrofit() {
apiInterface =
ApiClient.getClient(ApiClient.POST_STATUS_URL).create(ApiInterface.class);
Call<ModelForPostRequest> call = apiInterface.likeItem(modelForPostRequest);
call.enqueue(new Callback<ModelForPostRequest>() {
@Override
public void onResponse(Call<ModelForPostRequest> call,
Response<ModelForPostRequest> response) {
return response;
}
@Override
public void onFailure(Call<ModelForPostRequest> call, Throwable t) {
}
});
}}