--- title: '聲明式UI vs 命令式UI' tags: Flutter disqus: hackmd --- # 聲明式UI vs 命令式UI **目錄:** [TOC] ## 命令式UI - 注重於描述怎麼做,我們需要像下達命令一樣,手動處理每一項UI的更新 如果UI的複雜度足夠高的話,就會引發一系列問題,諸如: - 可維護性差:需要編寫大量的代碼邏輯來處理UI變化,這會使代碼變得臃腫、複雜、難以維護。 - 可複用性差:UI的設計與更新邏輯耦合在一起,導致只能在當前程序使用,難以復用。 - 健壯性差:UI元素之間的關聯度高,每個細微的改動都可能一系列未知的連鎖反應。 ```swift= var count = 0 let label = UILabel() // "+"號按钮 let plusBtn = UIButton() plusBtn.rx.tap .bind { count += 1 label.text = count } .disposed(by: disposeBag) // "-"號按钮 let minusBtn = UIButton() minusBtn.rx.tap .bind { count -= 1 label.text = count } .disposed(by: disposeBag) ``` ## 聲明式 - 注重於做什麼,具體怎麼做我們不關心 ```dart= class _CounterPageState extends State<CounterPage> { int _count = 0; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Column( children: [ // 数字 Text( _count.toString(), style: const TextStyle(fontSize: 48), ), Row( mainAxisSize: MainAxisSize.min, children: [ // +"号按钮 ElevatedButton( onPressed: () { setState(() { _count++; }); }, child: const Text("+")), // "-"号按钮 ElevatedButton( onPressed: () { setState(() { if (_count == 0) return; _count--; }); }, child: const Text("-")) ], ), ], ), ); } } ``` - 在這樣的代碼中,我們幾乎看不到任何操作UI更新的代碼,而這正是聲明式UI的特點,它注重於描述做什麼,而不是怎麼做,開發者只需要關注UI應該如何呈現,而不需要關心UI的具體實現過程。 ## 舉例 我們可以用一個點奶茶的例子來做個比喻: 當我們用命令式UI的思維方式去點一杯奶茶,相當於我們需要告訴製作者,沖一杯奶茶必須按照煮水、沖茶、加牛奶、加糖這幾個步驟,一步步來完成,也即我們需要明確每一個步驟,從而使得我們的想法具體而可操作。 而當我們用聲明式UI的思維方式去點一杯奶茶,則相當於我們只需要告訴製作者,我需要一杯“溫度適中、口感濃郁、有一點點甜味”的奶茶,而不必關心具體的製作步驟和操作細節。