web analytics

ลอง Migrate โปรเจค Flutter ให้เปิดใช้ Null Safety

สวัสดีครับเพื่อนๆ จากงาน Flutter Engage 2021 ที่ผ่านมา มีพูดถึงความสามารถใหม่ของ Dart ซึ่งจริงๆก็มีให้ลองเล่นมาสักพักแล้วใน dev channel นั่นก็คือ Null safety ซึ่งมากับ Dart เวอร์ชัน 2.12

ในบล็อกนี้ ผมมีโปรเจค Flutter เก่าตัวหนึ่งที่ใช้ dart 2.2 เป็นโปรเจคเล็กๆ จะมาลอง migrate มาใช้ Null safety กันครับ (ขอใช้คำว่า migrate แทนคำว่า ย้ายนะ)

เริ่มต้น

ก่อนอื่นใครยังไม่ได้ upgrade Flutter 2.0 ให้ upgrade ก่อนนะ

$ flutter upgrade

จากใน pubspec.yaml ตัว sdk โปรเจคนี้ของผมยังใช้ dart 2.2 อยู่เลย ซึ่งเก่ามาก ไม่รองรับ null safety

environment:
  sdk: '>=2.2.0 <3.0.0'

Migrate กันเถอะ

วิธีการ migrate ง่ายมากเพียงแค่รันคำสั่งนี้ใน terminal

$ dart migrate

สิ่งที่เจอ คือ terminal บอกว่า ก่อน migrate จะต้องให้ทุกๆ library รองรับ null safety ก่อนนะ ทั้งทางตรงและทางอ้อม และก็จะมีรายชื่อ package ที่ไม่รองรับ

แน่นอนว่า ผมยังไม่ได้ upgrade library เลย ทำให้ทุกอัน จะยังไม่รองรับ null safety นั่นเอง

ตรวจสอบเวอร์ชัน Library

ก่อนอื่น เราจะต้องตรวจสอบก่อนว่า library ที่เราใช้ในแอปของเรา รองรับ null safety ทั้งหมดหรือไม่ ให้เรารันคำสั่งนี้

$ dart pub outdated --mode=null-safety

terminal จะปรากฏรายการ library ที่เราใช้ โดยให้สังเกตช่วงขวาสุด ซึ่งจะเป็นเวอร์ชันล่าสุด โดยจะต้องมีเครื่องหมายติ๊กถูกทุกอัน

ถ้ามีอันที่ไม่รองรับล่ะ? แน่นอนว่าจะ migrate ไม่ได้ คงต้องรอให้ผู้พัฒนา library อัพเกรดก่อน โดยปัจจุบัน library ที่นิยมกันแทบทั้งหมดก็รองรับกันหมดแล้ว

อัพเกรด Library

ถ้า library ที่เราใช้ผ่านทั้งหมด ให้รัยคำสั่งนี้ได้เลย

$ dart pub upgrade --null-safety

จากนั้นดูที่ไฟล์ pubspec.yaml เวอร์ชันของ library ต่างๆ จะเป็นเวอร์ชันที่รองรับ null safety เรียบร้อยแล้ว

Migrate โค้ดทั้งโปรเจค

ตอนนี้ library ของเราพร้อมแล้ว แต่โค้ดของเรายังเป็นโค้ดแบบเดิม (non null safety) อยู่ ซึ่งถ้าเรานั่งปรับโค้ดกันเอง คงปวดหัวแย่ Flutter จึงมีเครื่องมือมาช่วย migrate แบบง่ายๆ

เพียงแค่รันคำสั่งนี้

$ dart migrate

หรือถ้า error แบบที่ไม่รู้จะแก้ยังไง ลองเพิ่มให้ migrate แบบไม่สนใจ exception

$ dart migrate --ignore-exceptions

จากนั้นจะปรากฏลิงค์ ให้กดเข้าไปที่ลิงค์ได้เลย

จากนั้นจะปรากฏหน้าเว็บที่แสดงโค้ดของแอปเราที่เพิ่มส่วน null safety โดยเราสามารถแก้ทีละไฟล์และกด apply ได้ หรือถ้าไม่คิดอะไรมากก็สามารถ migrate ได้ในคลิกเดียว โดยกดที่ปุ่ม APPLY MIGRATION

เรียบร้อยครับ เรา migrate มาใช้ null safety เรียบร้อยแล้ว โดยสังเกตที่ ไฟล์ pubspec.yaml ตรง sdk เวอร์ชันต่ำสุดที่เราใช้จะเป็น Dart 2.12 แล้วนั่นเอง

environment:
  sdk: '>=2.12.0 <3.0.0'

จบแล้ว

ใครยังไม่ได้ migrate มาใช้ null safety ก็ให้ลอง migrate ดูก่อนนะครับ ถ้าติดที่ library ก็อาจจะรอผู้พัฒนา library ก่อนก็ได้ (หรือไปกดดันใน issue ใน github ก็ได้)

หวังว่าบล็อกนี้จะมีประโยชน์นะครับ (: