diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 27c913d..d7f6c3e 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -20,7 +20,8 @@ "Bash(xargs -I {} sh -c 'echo \"\"\"\"=== {} ===\"\"\"\" && jar tf {} 2>/dev/null | grep -i \"\"\"\"gprinter\"\"\"\" | head -5')", "Bash(xmllint:*)", "Bash(xargs cat:*)", - "mcp__chrome-devtools__evaluate_script" + "mcp__chrome-devtools__evaluate_script", + "WebSearch" ], "deny": [], "ask": [] diff --git a/CLAUDE.md b/CLAUDE.md index f472a7e..cd4227e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -173,6 +173,256 @@ suspend fun getXxxDetails(@Query("id") id: String): BaseResultBean suspend fun saveXxx(@Body data: RequestBody): BaseResultBean ``` +## DataBinding + LiveData + ViewModel 核心知识 + +### 🎯 最关键的设置(最常见错误) + +**必须在 Activity 中设置 lifecycleOwner,否则 XML 中的 LiveData 不会自动更新 UI!** + +```kotlin +override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow("页面标题") + binding.viewModel = viewModel + + // ⚠️ 关键:必须设置,否则 LiveData 无法自动更新 UI + binding.lifecycleOwner = this +} +``` + +**BaseBindingActivity 已自动设置**,但如果手动使用 DataBinding 时务必记住! + +### 📖 ViewModel 中 LiveData 的定义规范 + +```kotlin +class XxxViewModel : BaseViewModel() { + // ✅ 推荐:对外暴露不可变的 LiveData + private val _dataBean = MutableLiveData() + val dataBean: LiveData = _dataBean + + // ✅ 简化写法:直接使用 MutableLiveData(项目常用) + val searchText = MutableLiveData() + val pageType = MutableLiveData(DetailsPageType.Add) + + fun loadData() { + // 主线程更新 + _dataBean.value = XxxBean() + + // 子线程更新(协程中不需要,已在主线程) + // _dataBean.postValue(XxxBean()) + } +} +``` + +### 📝 XML 中 LiveData 的绑定方式 + +#### 1. 单向绑定 `@{}`(只显示,ViewModel → UI) + +```xml + + + + + + + + + + + + + + + + + +``` + +#### 2. 双向绑定 `@={}`(可编辑,UI ↔ ViewModel) + +```xml + + + + + + + + +``` + +**双向绑定要求**: +- 字段必须是 `MutableLiveData` +- 用户输入时自动更新 ViewModel 的值 +- ViewModel 更新值时自动更新 UI + +#### 3. 点击事件绑定 + +```xml + +