Flutter: ListView.builder constructor

Grassroot Engineer
2 min readDec 5, 2020

--

https://medium.com/flutter-community/flutter-listview-and-scrollphysics-a-detailed-look-7f0912df2754

ในการทำงานกับข้อมูล list จำนวนน้อยๆ เราแค่ใช้ ListView constructor ก้อเพียงพอแล้วนะคับ (แต่มีข้อจำกัดคือ เราต้องรู้จำนวนของ itemsที่จะนำมาแสดงผลที่แน่นอน)
แต่ถ้าต้องทำงานกับ list ซึ่งมีจำนวน items มากๆ ไม่รู้ว่ามีจำนวนเท่าไหร่ จะเป็นการดีกว่าที่เราจะใช้ ListView.builder constructor

อีกเรื่องหนึ่งที่แตกต่างกันระหว่าง ListView และ ListView.builder คือ
​​​​ListView: จะมีการ render Widget ทั้งหมดใน items ไม่ว่าเราจะมองเห็นหรือไม่เห็นก้อตาม

ในขณะที่ ListView.builder จะ render เฉพาะส่วนที่เรามองเห็นเท่านั้น ซึ่งจะทำให้ได้ performance ที่ดีกว่าและแสดงผลได้ไม่จำกัด

https://dev.to/pedromassango/flutter-performance-tips-2-use-listview-builder-for-list-with-a-large-amount-of-items-37d1

เริ่มกันเลยดีกว่าคับ จะได้เห็นภาพ

  1. Create a data source
    ซึ่งในที่นี้จะสมมติขึ้นมาเป็นร้านขายหนังสือนะคับ ซึ่ง data source ของผมก้อจะหน้าตาประมาณนี้
List ซ้อนกัน 2 ชั้น

2. สร้าง ListView.builder ขึ้นมาโดย ​widget นี้จะมีส่วนที่ต้องการหลักๆ 2 อย่างคือ itemCount และ itemBuilder
- itemCount:
ให้เราระบุจำนวนของ items ที่จะเอามาใช้ (รับค่าเป็น int นะ)
- itemBuilder:
อันนี้รับค่าเป็น Function นะ คือ ให้ระบุว่าจะ return อะไร

หน้าตาของ Card และการกำหนดค่าให้กับ ListView.builder()

3. กำหนดสิ่งที่ต้องการแสดงใน Card() และใช้ interpolation {} ในการดึงค่ามาแสดงผลผ่านทาง Widget

แสดงการเชื่อมโยงระหว่าง code และ widget
หน้าตาก้อจะประมาณนี้ เลื่อนขึ้นลงได้ด้วยนะ

หน้าตา code ที่ใช้นะคับ

ps: จริงๆแล้ว ListView.builder เราสามารถ return ออกมาเป็นอะไรก็ได้นะคับ ไม่เฉพาะแค่ Card() เท่านั้น (อาจจะเป็น Column, ListTile หรืออย่างอื่นก็ได้)

เพิ่มเติมคับ จริงๆแล้วใน ListView ยังมีรูปแบบ scrolling ให้เราใช้ใน attribute physics: ได้ด้วยนะตามนี้เลย

1. physics: const NeverScrollableScrollPhysics()

นี่คือการ disable scrolling โดยจะให้แสดงค่า ListView แค่พอดีกับหน้าจอเท่าน้น จะ scrolling เพิ่มไม่ได้

2. physics: const BouncingScrollPhysics()

แบบนี้จะเป็นลูกเล่นของการ bounces back ที่เมื่อ scroll จนสุดขอบของจอแล้ว ยังสามารถไถเพื่อเพิ่มให้เห็นเป็น area สีขาวๆได้ (เหมือนกับใน iOS นะ)

3. physics: const ClampingScrollPhysics()

นี่คือ default ของ ListView ที่ไถขึ้นลงได้ปกติ

4. physics: const FixedExtentScrollPhysics()

นี่คือ การทำ scrolling แบบมีลูกเล่นเหมือนขึ้นไปขั้นบันได (แต่ไม่ค่อยได้ใช้นะ และต้องใช้งานร่วมกับ controller ด้วย ไม่งั้นจะพัง)

FixedExtentScrollController fixedExtentScrollController =
new FixedExtentScrollController();ListWheelScrollView(
controller: fixedExtentScrollController,
physics: FixedExtentScrollPhysics(),
children: monthsOfTheYear.map((month) {
return Card(
child: Row(
children: <Widget>[
Expanded(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
month,
style: TextStyle(fontSize: 18.0),
),
)),
],
));
}).toList(),
itemExtent: 60.0,
),

--

--

Grassroot Engineer
Grassroot Engineer

Written by Grassroot Engineer

ATM engineer who is interested in CODING and believe in EFFORT. — https://grassrootengineer.com

No responses yet