LiveData type mismatch در kotlin

پرسیده شده
فعالیت 1095 روز پیش
دیده شده 891 بار
0

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


mainViewModel.productsLiveData.observe(this){

}

 

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

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

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

 

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

 

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

فایل پیوست

MohammadMoghadasi
MohammadMoghadasi

28 دی 99

1
حذف شده

سلام و احترام

 

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

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

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

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

doc android 

 

 

 

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

28 دی 99

حذف شده
سلام دست عزیز با جاوا منظورم نیست با kotlin اینو نوشتم
MohammadMoghadasi

28 دی 99

حذف شده
*دوست
MohammadMoghadasi

28 دی 99

حذف شده
درسته این مورد رو ذکر نکرده بودید بسیار خب کد build.gradle ماژول app رو ارسال کنین تا بررسی کنم .(در فرمت مناسب)
0
حذف شده
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

توسط

MohammadMoghadasi

28 دی 99

0
حذف شده

در 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 باشد

 

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

28 دی 99

حذف شده
ممنونم من import androidx.lifecycle.Observer رو ایمپورت کردم و viewLifecycleOwner رو هم ایمپورت کردم بازم مشکل حل نشد
MohammadMoghadasi

28 دی 99

0
حذف شده

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

 

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

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

فایل پیوست

ابوالفضل رضایی

توسط

ابوالفضل رضایی

28 دی 99

0
حذف شده
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

توسط

MohammadMoghadasi

28 دی 99

0
حذف شده

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

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

28 دی 99

0
حذف شده

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

 

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

 

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

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

فایل پیوست

MohammadMoghadasi

توسط

MohammadMoghadasi

28 دی 99

حذف شده
خوشحالم واقعا مشکلتون حل شده ولی برام عجیبه چرا که در پاسخ دوم هم ذکر کردم که احتمال قوی import رو اشتباه وارد کردید .
حذف شده
خوشحالم واقعا مشکلتون حل شده ولی برام عجیبه چرا که در پاسخ دوم هم ذکر کردم که احتمال قوی import مربوطه رو اشتباه import کردید
حذف شده
دست شما درد نکنه ... این دوتا شبیه هم هست ایمپورتشون و اشتباها اون یکی ایمپورت شده و جالبه به اون شکلی هم نوشتم کار می کرد ولی به هر حال ... ممنونم
MohammadMoghadasi

28 دی 99

0
حذف شده

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


import androidx.lifecycle.observe

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

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

 

فایل پیوست

زیبا کریمی

توسط

زیبا کریمی

9 فروردین 00

حذف شده
این دو تا رو اشتباها به جای هم دیگه ایمپورت کرده بودم چک کنید شما هم اینطوریه عوض کنید import androidx.lifecycle.Observer import androidx.lifecycle.observe
MohammadMoghadasi

9 فروردین 00

حذف شده
اگه مشکلتون حل نشد به من ایمیل بزنید [email protected]
MohammadMoghadasi

9 فروردین 00

حذف شده
اندروید استودیو رو آپدیت کردم و به جای this گذاشتم viewLifecycleOwner درست شد
زیبا کریمی

11 فروردین 00