Good afternoon, I ran into the following problem: I'm trying to get a list of stores, but I get null in response. judging by the debag, it does not even go into the coroutine in DataAccessStrategy. A similar piece of code elsewhere in the app works, I can't figure out what the problem is.
LoginViewModel
class LoginViewModel @ViewModelInject constructor(private val remoteDataSource: OrderRemoteDataSource,
private val ordersRepository: OrdersRepository) :
ViewModel() {
var shops = ordersRepository.getShops()
fun showDialog(){
var shopList: List<Shop>? = shops.value?.data
var names:List<String?> = shopList!!.map{it.customName}
MaterialAlertDialogBuilder(LOGIN_ACTIVITY)
.setTitle("Выбрать магазин")
.setItems(names.toTypedArray()) { dialog, which ->
Log.d("LOGIN VIEW MODEL", "selected")
}
.show()
}
DataAccessStrategy
fun <T, A> performGetOperation(
databaseQuery: () -> LiveData<T>,
networkCall: suspend () -> Resource<A>,
saveCallResult: suspend (A) -> Unit
): LiveData<Resource<T>> =
liveData(Dispatchers.IO) {
emit(Resource.loading())
val source = databaseQuery.invoke().map { Resource.success(it) }
emitSource(source)
val responseStatus = networkCall.invoke()
if (responseStatus.status == SUCCESS) {
saveCallResult(responseStatus.data!!)
} else if (responseStatus.status == ERROR) {
emit(Resource.error(responseStatus.message!!))
emitSource(source)
}
}
OdredsRepository
class OrdersRepository @Inject constructor(
private val remoteDataSource: OrderRemoteDataSource,
private val localDataSource: OrdersDao
) {
fun getShops() = performGetOperation(
databaseQuery = { localDataSource.getAllShops() },
networkCall = { remoteDataSource.getShops() },
saveCallResult = { localDataSource.insertShop(it.results) }
)
}
OrderRemoteDataSource
class OrderRemoteDataSource @Inject constructor(
private val orderService: OrderService
) : BaseDataSource() {
suspend fun getShops() = getResult { orderService.getAllShops() }
OrderService
interface OrderService {
@GET("shops/all")
suspend fun getAllShops(): Response<ResultShops>
companion object {
const val MAUMarket_API_URL = "MYURL.com"
}
}
E/AndroidRuntime: FATAL EXCEPTION: main Process: ru.gkomega.navigation, PID: 4349 java.lang.NullPointerException at ru.gkomega.maumarket.ui.login.LoginViewModel.showDialog(LoginViewModel.kt:36) at ru.gkomega.maumarket.ui.login.LoginFragment$onViewCreated$1.onClick(LoginFragment.kt:50) at android.view.View.performClick(View.java:7259) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) at android.view.View.performClickInternal(View.java:7236) at android.view.View.access$3600(View.java:801) at android.view.View$PerformClick.run(View.java:27892) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
I will be glad of any help, thanks