Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewModel对象使用kotlin而不是java重新创建_Android_Kotlin_Mvvm_Android Livedata - Fatal编程技术网

Android ViewModel对象使用kotlin而不是java重新创建

Android ViewModel对象使用kotlin而不是java重新创建,android,kotlin,mvvm,android-livedata,Android,Kotlin,Mvvm,Android Livedata,我是kotlin和mvvm的新手,但是我能够让它在java中工作,但是当我在kotlin中制作了一个新的mvvm改造实例时,视图模型总是在调用OnCreate函数时被调用(根据文档,这不应该发生,在java中工作得很好) 主要活动: lateinit var viewModel : MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)

我是kotlin和mvvm的新手,但是我能够让它在java中工作,但是当我在kotlin中制作了一个新的mvvm改造实例时,视图模型总是在调用OnCreate函数时被调用(根据文档,这不应该发生,在java中工作得很好)

主要活动:

lateinit var viewModel : MyViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    //Here we can see the logs in every orientation changed in the emulator.
    viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    viewModel.getMutableLiveDataModel().observe(this, Observer {
        Log.d("zzzz","lamda executes onChanged method -> "+ it.otherValues). //element from model
    })
}
MyViewModel:

 class MyViewModel : ViewModel() {

private lateinit var objectTypeModel: MutableLiveData<MyTestModel>

fun getMutableLiveDataModel():MutableLiveData<MyTestModel>{

    //Gets the model from a retrofit service call
    objectTypeModel = MyRepository.getModelFromService()

    return objectTypeModel
}
}
类MyViewModel:ViewModel(){
私有lateinit var objectTypeModel:MutableLiveData
fun getMutableLiveDataModel():MutableLiveData{
//从改装服务调用获取模型
objectTypeModel=MyRepository.getModelFromService()
返回对象类型模型
}
}
我做错什么了吗?已尝试按照其他帖子中的建议将“viewModel”转换为局部变量

Java代码,main活动

MyViewModel模型;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
model=newviewmodelprovider(this.get)(MyViewModel.class);
model.getUsers().observe(这个,新的观察者(){
@凌驾
更改后的公共void(整数用户){
Log.d(“zzzz”,“更新值…”)
}
});
}
模型

公共类MyViewModel扩展了ViewModel{
私有可变LiveData用户;
公共LiveData getUsers(){
如果(用户==null){
用户=新的可变LiveData();
用户设置值(10);
}
返回用户;
}
}

如果不想重新创建视图模型,请按如下方式声明视图模型

 private val model: MyViewModel by activityViewModels()

有关更多详细信息,请参阅

我认为问题在于您的kotlin viewmodel类,如果您没有获得该值(除非您在其他类中没有更多问题)

  • 如果要修复未在MutableLiveData中设置数据的kotlin viewmodel类,则忘记添加一段代码

     //Here it is like this
     objectTypeModel.value= MyRepository.getModelFromService()
    
  • 只有在创建活动时才会调用AFAIK onCreate()。因此,如果再次创建viewmodel,这是很自然的。您还可以通过viewmodel类中的
    init{}
    方法检查它

  • 但是,如果您不满意,请将api调用从activity的
    onCreate()
    方法移动到viewmodels
    init{}
    方法,然后观察activity的更改。创建viewmodel对象时,将调用一次您的
    getMutableLiveDataModel()

  • 如果java viewmodel示例按预期运行。然后,尝试将java类转换为kotlin并再次运行它(只需将java代码粘贴到kotlin文件,它将要求您进行转换),它应该可以工作

  • 试一试

    main活动

    视图模型

    类MyViewModel:ViewModel(){
    val objectTypeModel=MutableLiveData()
    初始化{
    objectTypeModel.value=MyRepository.getModelFromService()
    }
    }
    
    我尝试了相同的概念,正如预期的那样,JavaKotlin中的功能是相同的。在LogCat中,我希望日志应该在每次旋转时都打印出来,事实确实如此。现在,让我告诉你为什么会这样

    因此,根据文档
    ViewModel
    实例在配置更改后保持活动状态。基本上,
    ViewModel
    使用相同的实例,前提是您的活动多次重新创建,但没有被破坏(调用
    finish()
    )。但这不是
    ViewModel
    的魔力,而是
    LiveData
    的魔力

    LiveData
    是一个可观察的数据视图持有者,因此它会在您在
    onCreate()
    中观察到的每个配置更改时,将最新保留的值发送给活动的观察者

    让我向你介绍我的代码

    Java

    // Activity
    
    public class JavaActivity extends AppCompatActivity {
        private static final String TAG = "JavaActivity";
    
        private JavaViewModel javaViewModel;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_java);
    
            // Ignore this listener
            findViewById(R.id.go_to_kotlin_activity).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    finish();
                }
            });
    
            // Main
            javaViewModel = new ViewModelProvider(this).get(JavaViewModel.class);
            javaViewModel.getJavaLiveData().observe(this, new Observer<Integer>() {
                @Override
                public void onChanged(Integer integer) {
                    Log.d(TAG, "onChanged: " + integer);
                }
            });
        }
    }
    
    // ViewModel
    
    public class JavaViewModel extends ViewModel {
        private MutableLiveData<Integer> javaLiveData;
    
        public LiveData<Integer> getJavaLiveData() {
            if(javaLiveData == null) {
                javaLiveData = new MutableLiveData<>();
                javaLiveData.setValue(10);
            }
            return javaLiveData;
        }
    }
    
    //活动
    公共类JavaActivity扩展了AppCompatActivity{
    私有静态最终字符串TAG=“JavaActivity”;
    私有JavaViewModel JavaViewModel;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_java);
    //忽略此侦听器
    findViewById(R.id.go_to_kotlin_活动)。setOnClickListener(新视图。OnClickListener(){
    @凌驾
    公共void onClick(视图v){
    完成();
    }
    });
    //主要
    javaViewModel=newviewmodelprovider(this.get)(javaViewModel.class);
    javaViewModel.getJavaLiveData().observe(这是一个新的观察者(){
    @凌驾
    更改后的公共void(整数){
    Log.d(标记“onChanged:+整数);
    }
    });
    }
    }
    //视图模型
    公共类JavaViewModel扩展了ViewModel{
    私有MutableLiveData-javaLiveData;
    公共LiveData getJavaLiveData(){
    if(javaLiveData==null){
    javaLiveData=新的MutableLiveData();
    javaLiveData.setValue(10);
    }
    返回javaLiveData;
    }
    }
    
    Kotlin

    // Activity
    
    class KotlinActivity : AppCompatActivity() {
        companion object {
            private const val TAG = "KotlinActivity"
        }
    
        private lateinit var kotlinViewModel: KotlinViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_kotlin)
    
            // Ignore this listener
            findViewById<Button>(R.id.go_to_java_activity_btn).setOnClickListener {
                startActivity(Intent(this, JavaActivity::class.java))
            }
    
            // Main
            kotlinViewModel = ViewModelProvider(this).get(KotlinViewModel::class.java)
            kotlinViewModel.getKotlinLiveData().observe(this, Observer {
                Log.d(TAG, "onCreate: $it")
            })
        }
    }
    
    // ViewModel
    
    class KotlinViewModel : ViewModel() {
        private lateinit var kotlinLiveData: MutableLiveData<Int>
    
        fun getKotlinLiveData(): LiveData<Int> {
            if (!::kotlinLiveData.isInitialized) {
                kotlinLiveData = MutableLiveData()
                kotlinLiveData.value = 10
            }
            return kotlinLiveData
        }
    }
    
    //活动
    类KotlinActivity:AppCompatActivity(){
    伴星{
    private const val TAG=“KotlinActivity”
    }
    私有lateinit var kotlinViewModel:kotlinViewModel
    重写创建时的乐趣(savedInstanceState:Bundle?){
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_kotlin)
    //忽略此侦听器
    findViewById(R.id.go\u to\u java\u activity\u btn){
    startActivity(Intent(这是JavaActivity::class.java))
    }
    //主要
    kotlinViewModel=ViewModelProvider(this).get(kotlinViewModel::class.java)
    kotlinViewModel.getKotlinLiveData().observe(此,观察者{
    Log.d(标记“onCreate:$it”)
    })
    }
    }
    //视图模型
    类KotlinViewModel:ViewModel(){
    私有lateinit var kotlinLiveData:MutableLiveData
    fun GetKotLiveData():LiveData{
    如果(!::KotLiveData.isInitialized){
    
    lateinit var viewModel : MyViewModel
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
        viewModel.objectTypeModel.observe(this, Observer {
            Log.d("zzzz","lamda executes onChanged method -> "+ it.otherValues).         
            //element from model
        })
    }
    
    class MyViewModel : ViewModel() {
    
        val objectTypeModel= MutableLiveData<MyTestModel>()
    
        init {
            objectTypeModel.value = MyRepository.getModelFromService()
    
        }
    }
    
    // Activity
    
    public class JavaActivity extends AppCompatActivity {
        private static final String TAG = "JavaActivity";
    
        private JavaViewModel javaViewModel;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_java);
    
            // Ignore this listener
            findViewById(R.id.go_to_kotlin_activity).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    finish();
                }
            });
    
            // Main
            javaViewModel = new ViewModelProvider(this).get(JavaViewModel.class);
            javaViewModel.getJavaLiveData().observe(this, new Observer<Integer>() {
                @Override
                public void onChanged(Integer integer) {
                    Log.d(TAG, "onChanged: " + integer);
                }
            });
        }
    }
    
    // ViewModel
    
    public class JavaViewModel extends ViewModel {
        private MutableLiveData<Integer> javaLiveData;
    
        public LiveData<Integer> getJavaLiveData() {
            if(javaLiveData == null) {
                javaLiveData = new MutableLiveData<>();
                javaLiveData.setValue(10);
            }
            return javaLiveData;
        }
    }
    
    // Activity
    
    class KotlinActivity : AppCompatActivity() {
        companion object {
            private const val TAG = "KotlinActivity"
        }
    
        private lateinit var kotlinViewModel: KotlinViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_kotlin)
    
            // Ignore this listener
            findViewById<Button>(R.id.go_to_java_activity_btn).setOnClickListener {
                startActivity(Intent(this, JavaActivity::class.java))
            }
    
            // Main
            kotlinViewModel = ViewModelProvider(this).get(KotlinViewModel::class.java)
            kotlinViewModel.getKotlinLiveData().observe(this, Observer {
                Log.d(TAG, "onCreate: $it")
            })
        }
    }
    
    // ViewModel
    
    class KotlinViewModel : ViewModel() {
        private lateinit var kotlinLiveData: MutableLiveData<Int>
    
        fun getKotlinLiveData(): LiveData<Int> {
            if (!::kotlinLiveData.isInitialized) {
                kotlinLiveData = MutableLiveData()
                kotlinLiveData.value = 10
            }
            return kotlinLiveData
        }
    }