将超级调用称为“超级不是表达式”

时间:2018-11-08 12:44:08

标签: java android mvvm kotlin android-livedata

我从这里学习了如何从Google指南中学习如何实现MVVM:  https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#8(特别是指向我感兴趣的页面的链接)。
因为我了解用Java实现它,所以我决定改用Kotlin。 在扩展AndroidViewModel的类中初始化构造函数时,我需要调用super,这会引发以下错误:

  

“ super”不是表达式,只能在左侧使用   点('。')“

我在Google上搜索并发现类似的topic,但我完全不了解它,因此无法解决问题。 这是我对ViewModel类的代码:

 class NotesViewModel private constructor(application: Application) : AndroidViewModel(application){

    var mRepository: NotesRepository? = null
    var mAllNotes: LiveData<List<Notes>>? = null

    init {
        super(application) // <-- here it throws me an error
        mRepository = NotesRepository(application)
        mAllNotes = mRepository!!.getAllWords()
    }

    fun getAllNotes(): LiveData<List<Notes>>{
        return mAllNotes!!
    }

    fun insert(notes: Notes){
        mRepository!!.insert(notes)
    }

}

那么,我应该如何正确地调用super,构造一个构造函数? 这是此类的正确Java代码:

public class WordViewModel extends AndroidViewModel {

  private WordRepository mRepository;
    private LiveData<List<Word>> mAllWords;

    public WordViewModel(Application application) {
        super(application);
        mRepository = new WordRepository(application);
        mAllWords = mRepository.getAllWords();
    }

    LiveData<List<Word>> getAllWords() {
        return mAllWords;
    }

    void insert(Word word) {
        mRepository.insert(word);
    }
}

1 个答案:

答案 0 :(得分:6)

您已经在这里叫超级:NotesViewModel private constructor(application: Application) : AndroidViewModel(application)

另一个问题是您的构造函数为private

只需使其成为public并从super删除init()通话