鐵人賽第21天了,我App核心互動體驗已經在第二週建立起來。現在要開始將先前規劃中預留的空間一一填滿,讓App的功能更加完整。根據開發藍圖,今天的主軸是UI的擴充實作~
這兩塊今天雖只先建構畫面,尚未串接完整功能,但是承先啟後的重要步驟,筆記區將在明天與語音輸入功能結合 ,而設定頁則是為使用者提供了客製化與管理權限的入口。
一、根據Wireframe實作卡片上的「筆記記錄區」
還記得在Day 8設計卡片UI時,我們特意在下方按鈕區的上方,為「筆記記錄區」預留了空間嗎 ?今天就是要把這個設計從Wireframe變為現實的時候了。
為了不讓主畫面過於雜亂,筆記區預設為收合狀態,只有在使用者點擊特定圖示後才會展開。這樣的設計可以讓使用者在滑動卡片時,專注於靈感本身,在需要記錄時才喚出輸入介面。
觸發入口:在卡片摘要的下方,原先的留白處,加入一個IconButton,圖示可以選用notes或edit,讓使用者直觀地了解其功能。
展開式輸入區:點擊按鈕後,利用ExpansionTile或自定義的動畫來流暢地展開一個輸入區域。這個區域包含:
這個UI實作,完美呼應了我在第二、三週專注於核心UI與優化的目標。
Flutter Widget結構示意:
Column(
children: [
// ... 卡片摘要、標籤等內容
IconButton(
icon: Icon(Icons.notes),
onPressed: () {
// 更新狀態,展開筆記區
},
),
if (isNoteAreaExpanded) ...[
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: TextField(
maxLines: 4,
decoration: InputDecoration(
hintText: '在這裡記錄你的想法...',
border: OutlineInputBorder(),
),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
IconButton(
icon: Icon(Icons.mic),
onPressed: () {
// Day 22: 語音轉文字功能
},
),
ElevatedButton(
onPressed: () {
// 儲存筆記到 Firestore
},
child: Text('儲存'),
),
],
),
],
// ... 下方的保留、捨棄、收藏、分享按鈕
],
)
二、建立「設定頁」UI
一個成熟的App不能沒有設定頁,這是使用者進行個人化設定、管理App權限的地方,雖然許多功能會在後續迭代中才會加入,但預先建立好這個框架是至關重要的 。
Flutter Widget 結構示意:
Scaffold(
appBar: AppBar(
title: Text('設定'),
),
body: ListView(
children: [
ListTile(
title: Text('RSS 來源管理'),
leading: Icon(Icons.rss_feed),
trailing: Icon(Icons.arrow_forward_ios),
onTap: () {
// 導航到 RSS 管理頁面
},
),
ListTile(
title: Text('權限設定'),
leading: Icon(Icons.security),
trailing: Icon(Icons.arrow_forward_ios),
onTap: () {
// 導航到權限設定頁面
},
),
// ... 其他設定選項,如「關於我們」、「版本號」等
],
),
)
今天將App的UI骨架再度擴充,完成了筆記區和設定頁的畫面,雖然只是靜態的UI實作,但這一步為接下來的功能開發打下了堅實的基礎:)
下一步,明天將接一個非常有趣的核心功能挑戰:導入導入speech_to_text套件,將今天做好的筆記區UI與麥克風按鈕結合,實現「語音轉文字筆記」的酷炫功能,明天見~
【哈囉你好:)感謝你的閱讀!其他我會常出沒的地方:Threads】