تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۸ MohammadMoghadasi
LiveData type mismatch در kotlin
جامعه جاوا (اندروید) ایجاد شده در ۲۸ دی ۱۳۹۹

من مثل استاد از این فرم برای نوشتن استفاده کردن


mainViewModel.productsLiveData.observe(this){
}

 

اما متاسفانه خطای 

LiveData type mismatch : inferred type is ()-> but Observer<in List<Product>!> was expected

رو دریافت می‌کردم و به صورت 

 

mainViewModel.productsLiveData.observe(this , Observer {  }) 

 

مجبور شدم بنویسم کسی اگه به این مشکل خورد یا جواب این مشکل رو می‌دونست خوشحال میشم’

سلام و احترام

 

همونطور که در جلسه lambda گفته شد برای استفاده از قابلیت lambda که از جاوای ۸ این ویژگی اضافه شده کاری کنید که پروژه شما از جاوا ۸ ساپورت کند.

به همین دلیل شما باید برای استفاده از قابلیت lambda تکه کد زیر رو به build.gradle سطح app اضافه کنید .

این مورد رو تست کنین ببینین حل میشه موردتون.

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

doc android 

 

 

 

پوریا شفیعی ۲۸ دی ۱۳۹۹، ۱۲:۵۸
plugins {
    id 'com.android.application'
    id 'kotlin-android'
}
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"
    defaultConfig {
        applicationId "com.example.nikestore"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}
dependencies {
    def koin_version = "2.2.0"
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    // Koin for Android
    implementation "org.koin:koin-android:$koin_version"
    // or Koin for Lifecycle scoping
    implementation "org.koin:koin-android-scope:$koin_version"
    // or Koin for Android Architecture ViewModel
    implementation "org.koin:koin-android-viewmodel:$koin_version"
    testImplementation 'junit:junit:4.+'
    implementation 'com.google.code.gson:gson:2.8.6'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    implementation "com.github.akarnokd:rxjava3-retrofit-adapter:3.0.0"
    implementation "com.squareup.retrofit2:retrofit:2.9.0"
    implementation 'io.reactivex.rxjava3:rxjava:3.0.0'
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
}
MohammadMoghadasi ۲۸ دی ۱۳۹۹، ۱۳:۴۳

در build.gradle مشکلی ندیدم 

خب تست کنین ببینین اگر بجای this از viewLifecycleOwner  استفاده کنید باز هم چنین مشکلی رو دارید؟

همچنین عمل casing رو هم انجام بدین یعنی it as ArrayList<Product> (البته که اگر adapter رو پیاده سازی کرده باشین)

که میشود:

mainViewModel.productsLiveData.observe(viewLifecycleOwner) { 
            productListAdapter.products = it as ArrayList<Product>
}

اگر این مورد نبود احتمال قوی import اشتباهی انجام دادید و باید import تون androidx.lifecycle.Observer و نه ,  java.util.Observer باشد

 

پوریا شفیعی ۲۸ دی ۱۳۹۹، ۱۴:۳۶

سلام دوست عزیز..

 

چیزی که من متوجه شدم اینه که ارور شما میگه لایو دیتاتون تطابق نداره، شما نوعش رو خالی ست کردید و الان میخواین لیست پروداکت هارو بگیرید و این باعث خطا میشه، و فکر کنم برای همین باید به اونصورت بنویسید که اون نمیتونه بفهمه که این لایو دیتا دقیقا الان چی میخواد برگردونه.. وگرنه اگه میدونست باید چی رو برگردونه به صورت lambda میتونستید بنویسیدش و هایلایتش نشون میداد چیزی که براتون بر میگردونه رو..

لطفا قسمتی که لایو دیتا رو initialize کردید رو چک کنید و یا کد ViewModel تون رو اینجا قرار بدید

ابوالفضل رضایی ۲۸ دی ۱۳۹۹، ۱۶:۰۷
class MainViewModel(val repository: ProductRepository): NikeViewModel() {
    val productsLiveData  = MutableLiveData<List<Product>>()
    init {
        repository.getProducts()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(object : SingleObserver<List<Product>> {
                    override fun onSuccess(t: List<Product>?) {
                        productsLiveData.value = t
                    }
                    override fun onSubscribe(d: Disposable?) {
                        composeDisposable.add(d)
                    }
                    override fun onError(e: Throwable?) {
                        Log.e("MainViewModel", "onError: $e" )
                    }
                })
    }
}

کد ویو مدل هست ممنونم واقعا از مشارکت دوستان اما دوستان در سوال من ذکر کردم که به صورت 

mainViewModel.productsLiveData.observe(this , Observer { })

مشکل رو حل کردم

مشکل اینه به این صورت که استاد گفتن برا من کار نمی‌کرد و این عجیبه !

mainViewModel.productsLiveData.observe(this){ }

و همچنین دقت کنید که زبان کاتلین استفاده شده

MohammadMoghadasi ۲۸ دی ۱۳۹۹، ۱۶:۱۰

درسته حقیقتا این مورد شما ذهن من رو هم درگیر کرده دلیلش هم این هست که یک بار به چنین اروری قبلا برخورد کرده بودم ولی حال هر چی فکر میکنم یادم نمیاد 
ممنون از پاسخ ابولفضل ولی اقای مقدسی گفتن که کد رو شبیه استاد نوشتند.
اگر دوست دارید پروژه رو اپلود کنین (میتونین از سایت دیگه اپلود کنین و لینکشو اینجا قرار بدین) تا من بررسی کنم 
قطعا اونطوری دیباگینگ راحت‌تر خواهد بود تا اینکه بهتون بگم فلان کلاس رو بررسی کنید 
 

پوریا شفیعی ۲۸ دی ۱۳۹۹، ۱۷:۰۳

مشکل رو حل کردم 

 

import androidx.lifecycle.Observer
import androidx.lifecycle.observe

 

رو با هم اشتباه نگیرید دوستان خلاصه :)))))

تشکر از همه دوستان

MohammadMoghadasi ۲۸ دی ۱۳۹۹، ۱۸:۰۳

سلام من هم دقیقا مثل استاد کد هارو نوشتم و به این مشکل خوردم ولی متوجه نشدم شما مشکل رو چطور حل کردین!


import androidx.lifecycle.observe

این ایمپورت مربوط به کدوم قسمت میشه من اصلا پیدا نکردم که ببینم  درسته یا نه

ممنون نیشم بیشتر توضیح بدین 

 

زیبا کریمی ۰۹ فروردین ۱۴۰۰، ۱۳:۳۷