Flutter: bloc และ flutter_bloc v6 มาแล้ว!

Published on

Authored by Pete. Pittawat Taveekitworachai.


หลังจากที่ bloc v5 และ flutter_bloc v5 ได้ถูกปล่อยออกมาไม่นาน โดยมีการเปลี่ยนแปลงหลัก ๆ ในการนำ cubit มาเป็นพื้นฐานในการจัดการ State และสร้าง bloc on-top ขึ้นไปนั้น ไม่นานทางคุณ​ Felix Angelov ก็ได้ปล่อย bloc และ flutter_bloc v6 ออกมา โดยการเปลี่ยนแปลงหลัก ๆ จะเป็นการนำ cubit เข้ามาอยู่ภายใน bloc แทนที่จะเป็น Dependency ที่ bloc ไปเรียกใช้งาน นอกจากนี้ยังมีการปรับปรุงอื่น ๆ รวมถึงแก้ไขข้อผิดพลาด จะมีอะไรบ้างนั้นไปดูกันได้เลย


cubit

อย่างที่ได้เกริ่นไว้ว่าในเวอร์ชันนี้ bloc ได้นำ cubit มารวมเป็นส่วนหนึ่งของ bloc ไปเรียบร้อย หากยังจำกันได้ cubit นั้นเป็นหนึ่งในวิธีที่ใช้ในการจัดการ State ที่คล้ายกับไอเดียของ BLoC นั่นคือพยายามแยก Logic ออกมาจาก UI เพื่อให้ UI มีความเรียบง่ายมากที่สุด

โดยตัวกลาง (ซึ่งปกติมักเรียกว่า BLoC) จะเป็นตัวที่คอยพิจารณาว่าจาก Event ที่ถูกส่งเข้ามาจะเปลี่ยนไปเป็น State ไหน โดยหาก State นั้น ๆ ต้องมีการใช้ข้อมูลจากแหล่งอื่น ๆ ก็จะมีการจัดการให้เรียบร้อยด้วย

โดยการใช้ cubit นั้นจะเรียบง่ายกว่า โดยไม่ต้องมี Event เข้ามาเกี่ยวข้อง แต่ใช้การอัพเดทต่าง ๆ ผ่านฟังก์ชันแทน ซึ่งน่าจะเหมาะสำหรับผู้ที่คุ้นเคยรูปแบบการจัดการ State แบบนี้จากภาษาอื่น ๆ

ซึ่งในเวอร์ชันนี้คุณ​ Felix ก็ได้นำ cubit เข้ามารวมเป็นส่วนหนึ่งของ bloc และได้ทำการ Discontinued cubit ไป

แน่นอนว่า bloc เดิมนั้นก็ยังคงมีให้เรียกใช้อยู่ โดยมีพื้นฐานมาจาก cubit แต่ใช้การจัดการสิ่งต่าง ๆ ผ่าน Event แทน


Breaking Changes

สำหรับ Breaking Changes หลัก ๆ ก็จะได้แก่การที่เมื่อ Observer มา Subscribe ที่ Bloc แล้วในเวอร์ชันเก่านั้นจะได้รับ Current State เป็น State แรก แต่ในเวอร์ชันนี้จะไม่ได้แล้ว ต้องรอรับ State ตัวถัดไปแทน ซึ่งก็เป็นการปรับปรุงเพื่อให้สอดคล้องกับพฤติกรรมของ Stream ใน Dart มายิ่งขึ้น

นอกจากนี้ยังมี onError ใน BlocObserver ที่รับ Cubit เป็นพารามิเตอร์ตัวแรกของฟังก์ชัน และการที่เพิ่มความสามารถให้ bloc และ cubit สามารถ Emit Initial State ได้

สำหรับ flutter_bloc ในทุก ๆ Widget ที่มีการรับพารามิเตอร์ที่ชื่อ bloc ก็ได้เปลี่ยนไปใช้ชื่อ cubit แทน เพื่อให้มีความเหมาะสมมากยิ่งขึ้น อันได้แก่ Widget ต่อไปนี้ BlocBuilder, BlocListener, BlocConsumer


การเปลี่ยนแปลงอื่น ๆ

สำหรับการเปลี่ยนแปลงอื่น ๆ ก็มีการเพิ่ม onChange ให้กับ BlocObserver รวมถึงการเพิ่มกฎต่าง ๆ ของ Linter และมีการเพิ่ม Annotation @visibleForTesting ให้กับ emit ใน Cubit สำหรับใช้ในการ Test รวมถึงการปรับปรุง Document ทั่วไป


📚 Hope you enjoy reading! 📚