优化 demo
This commit is contained in:
@@ -3205,7 +3205,13 @@ flowchart LR
|
||||
<p><strong>两大核心逻辑</strong>:</p>
|
||||
<p>1. <strong>MVVM 分层职责</strong>:View(view/)只负责渲染和用户交互,ViewModel(presentation/)持有状态并处理业务逻辑,Model(model/ + entities/)定义数据结构 —— 三者通过 Riverpod Provider 连接,职责严格分离。</p>
|
||||
<p>2. <strong>Riverpod 单向数据流</strong>:用户操作 → <code>ref.read(vm.notifier).action()</code> → ViewModel 处理逻辑 → <code>state = newState</code> → <code>ref.watch(vm)</code> 检测变化 → View 自动 rebuild。数据永远单向流动,UI 永远是状态的函数。</p>
|
||||
<p>3. <strong>Widget 纯展示原则</strong>:View(Widget)层对业务数据严格只读。所有逻辑(导航、CRUD、状态变更、条件判断)必须在 ViewModel 中完成,View 只调用 ViewModel 方法并渲染返回的 State。包括 demo/测试页面也不例外。</p>
|
||||
<p>3. <strong>Widget 纯展示原则</strong>:<code>build()</code> 只做一件事——把 State 属性映射成 Widget 树,不允许出现任何计算或逻辑。</p>
|
||||
<ul>
|
||||
<li><strong>派生显示值必须是 State getter</strong>:凡是需要从 State 字段推导出另一个值(文本、颜色、样式等),一律写成 State 的 getter,Widget 只读取结果。例如:<code>String get buttonLabel => testStarted ? '结束' : '开始';</code>,Widget 写 <code>state.buttonLabel</code>,不在 <code>build()</code> 里写三元。</li>
|
||||
<li><strong>禁止 <code>build()</code> 内定义局部计算变量</strong>:<code>final isSelected = current == mode</code> 这类从构造参数/state 派生值的局部变量,不属于 <code>build()</code>。组件应接受已算好的 <code>bool isSelected</code> 参数,由父级或 State getter 负责计算。</li>
|
||||
<li><strong>导航、CRUD、状态变更全部在 ViewModel 中完成</strong>,Widget 只转发事件:<code>onTap: () => ref.read(vm.notifier).doAction()</code>。</li>
|
||||
<li><strong>demo/测试页面同样适用</strong>:demo 代码是示范,别人会照着模仿,写法必须与正式页面完全一致。</li>
|
||||
</ul>
|
||||
</blockquote>
|
||||
|
||||
<hr>
|
||||
|
||||
Reference in New Issue
Block a user