当前位置: 首页 > 知识库问答 >
问题:

在协同路由内触发时双向数据绑定不工作

梁丘亦
2023-03-14

在我从BE API调用中获得一些数据后,我正在尝试通过数据绑定更新文本。如果代码没有在协同程序内执行,我的解决方案就可以完美地工作。如果在协同程序内设置了变量,则不会更新编辑文本。我的XML代码:

<com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:text="@={ viewModel.name }" />

我的viewModel代码:

var name: String = ""
        get() = field.trim()
        set(value) {
            field = value
            //some other unrelated code
        }
...
fun getName(){
    name = "first"
    viewModelScope.launch(Dispatchers.Main) {
        name = "second"
    }
}

text输入文本(text)将更新为“第一个”,但不会更新为“第二个”。我和其他调度员试过了。我还通过调试器验证了两次都触发了“name”变量setter。它只是不更新编辑文本。你知道是什么导致了这一切吗?

共有2个答案

文华美
2023-03-14

您的名称字段需要可见。

目前,没有任何东西告诉EditText该字段已更新并需要反弹。您可能会从最初在绑定上设置viewModel中看到“第一”。

查看有关可观察性的文档。

我对另一个类似问题的回答可能也会有所帮助。

亢建木
2023-03-14

在我的例子中,通过在以下代码中设置lifecycleOwner属性的值,问题得到了解决。数据绑定现在已按预期完成。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  super.onViewCreated(view, savedInstanceState)
    
  postDetailViewModel = ViewModelProvider(this)[PostDetailViewModel::class.java]
  binding.varPostDetailViewModel = postDetailViewModel
  binding.lifecycleOwner = this // Add this line
    
  coroutineScope.launch {
    arguments?.let {
      val args = PostDetailFragmentArgs.fromBundle(it)
      postDetailViewModel.getPostDetail(args.postID)
    }
  }
}
 类似资料:
  • 我有一个模型: 我用片段布局连接它: 在onCreateView方法的片段类中: 我可以从fragment或ViewModel类中更改值,但是当我试图在Logcat中的ViewModel的方法中获取值时,我得到的消息是:我缺少了什么,这样双向数据绑定也可以从另一个方向工作?简而言之,数据在界面上从ViewModel/Fragment流向EditText,但不会从界面上的EditText流向View

  • 1. 前言 本小节我们将介绍 Vue 中数据的双向绑定指令 v-model。v-model 的学习相对简单 我们可以用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。 2. 慕课解释 用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选

  • 我在react-redux项目中使用react-router-dom 5.1.2。对于我的路由,我有两个文件。第一个是App.js,其中包含redux存储和BrowserRout的提供程序: 在下一层,我有Main.js,它有到所有组件的路径 我遇到的问题是,当我使用path=“/games/:game_id/fighters/new”进入路线时,而不是显示FighterForm。js,它会重定向

  • 出于好奇和增加知识,我想在dom元素和javascript变量之间实现某种双向数据绑定。 我很幸运,在这里@stackoverflow找到了一个很好的答案,解决了我一半的问题,这就引出了这个要点https://gist.github.com/384583,但我仍然无法100%完成这件事。 下面是我的代码示例:http://jsfiddle.net/bpH6Z/ 如果您尝试运行fiddle并单击“查

  • 本文向大家介绍Vue实现双向数据绑定,包括了Vue实现双向数据绑定的使用技巧和注意事项,需要的朋友参考一下 Vue实现双向数据绑定的方式,具体内容如下 Vue是如何实现双向数据绑定的呢?答案是前端数据劫持。其通过Object.defineProperty()方法,这个方法可以设置getter和setter函数,在setter函数中,就可以监听到数据的变化,从而更新绑定的元素的值。 实现对象属性变化

  • Mpx针对表单组件提供了wx:model双向绑定指令,类似于v-model,该指令是一个语法糖指令,监听了组件抛出的输入事件并对绑定的数据进行更新,默认情况下会监听表单组件的input事件,并将event.detail.value中的数据更新到组件的value属性上。 简单实用示例如下: <view> <input type="text" wx:model="{{message}}"> <