ListView有兩種用法
使用children 跟 使用builder
使用children就是會一次事先把所有widget都create出來
使用builder則是滾動到該widget時才create
我個人是把它類比成iOS的UITableView static/dynamic cell
或Android的listView/RecycleView
scrollDirection: Axis.horizontal
就變橫了⚠️⚠️⚠️tableFooterView = UIView()
的效果...⚠️⚠️⚠️這種的ListView就可以當作SingleChildScrollView + Column
下圖顯示了ListTile不同狀態顯示的樣子(如果是disable就不能被tap)
除了onTap, 還提供了onLongPress call back
至於ListView用法簡潔了很多, 直接看code吧
//主要的部分就這樣, 沒了
final list = ListView.builder(
controller: listViewController,
//itemExtent: 44, //如果指定高度, null的話就自適應
itemCount: messages.length, //numberOfRowsInSection
itemBuilder: (ctx, idx) { //cellForRowAt
return MessageTile("${messages[idx]}");
}
)
//輸入的部分
TextField(
controller: textFieldController,
decoration: InputDecoration(
labelText: '有什麼話想說?',
prefixIcon: Icon(Icons.message),
),
onSubmitted: (text) { //送出訊息後, 透過listViewController定位至最新一筆
setState(() {
if (text.length > 0) {
messages.add(text);
}
listViewController.jumpTo(listViewController.position.maxScrollExtent);
});
},
)
//訊息widget的layout 使用兩層cell一層, label一層
Container(
padding: EdgeInsets.all(8), //cell邊距(就是圖片邊距)
alignment: Alignment.centerRight, //user視角的訊息是靠右的
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: 200), //限制寬度, 超過折行
child: Container(
padding: EdgeInsets.fromLTRB(24, 16, 32, 16), //label邊距, 讓圖片包起來
child: Text(message, //文字訊息預設靠左
style: TextStyle(color: Colors.white),
),
decoration: BoxDecoration( //給個底圖
image: DecorationImage(
image: AssetImage("resource/images/bubble_full_tail.png"),
fit: BoxFit.fill
)
)
)
)
)
Android | iOS | Flutter |
---|---|---|
ListView | UITableView static cell | ListView use children |
RecycleView | UITableView dynamic cell | ListView.builder |
本集內容Android版請見:iOS Developer Learning Android. Lesson 16
下集預告:還是列表
最後提供一下github.com/mark33699/IDLF