
เมื่อไม่นานมานี้ผมได้มีโอกาสสร้าง MVP ตัวหนึ่งด้วย Flutter และด้วยความที่ส่วนตัวเป็นคนชอบเข้าไปดู ค้นหาโปรเจคทั้งหลายที่มีคนเคยเขียนไว้ใน GitHub เพื่อดูว่า Open Source โปรเจคต่าง ๆ เขามีวิธีการเขียน Widget ที่สามารถนำกลับมาใช้งานใหม่ได้อย่างไรกันบ้าง การจัดการ codebase อย่างไร หรือแอบจิ๊กเอา GitHub Workflow ไฟล์มาปรับในโปรเจคบ้างก็มี แต่เอาละเข้าเนื้อหากันเลย
ตอนนั้นคือผม clone โปรเจคลงมาแล้วลองนำมาเล่นบนเครื่องตัวเองทำให้เจอปัญหาในหลายเรื่องไม่ว่าจะเป็น โปรเจคเก่าไปแล้ว Flutter SDK หรือ dart ในเครื่องมีเวอร์ชันที่ใหม่ไปทำให้การนำมารันทำได้ค่อนข้างยาก รวมถึงการอัพเกรดและดาวน์เกรดเช่นกัน
การอัพเดทและดาวน์เกรดก็มีปัญหาเช่นกัน ถ้าใครเคยลงด้วย Homebrew การอัพเกรดอาจทำให้ Environment path ผิดทำให้ต้องมาเซ็ทใหม่กันอีกรอบเพราะเลขเวอร์ชันเปลี่ยนไป
แล้ว flutter upgrade | downgrade ใช้ไม่ได้เหรอ?
ใช้ได้เช่นกับครับ ถ้าเราสามารถใช้ได้อย่างไม่มีปัญหา แต่ผมลองใช้แล้วติดปัญหาตรงที่ถ้าเกิดเรา downgrade flutter จะเวิร์คกับเวอร์ชันที่อยู่ใน Flutter build release channel เท่านั้น ถ้าต่ำหรือเก่ากว่าหรือระบุเป็นเลขเวอร์ชันไปเลยก็จะไม่ได้ละ

fvm คืออะไร
หากใครเคยใช้ nvm, rbenv, jenv สิ่งนี้คือสิ่งเดียวกันเลยครับ มันจะช่วยให้มี Flutter หลายเวอร์ชันได้ในเครื่องเดียว รวมถึงการจัดการ การสลับไปมาระหว่างเวอร์ชันได้อย่างไร้รอยต่อ (หากใครไม่เคยใช้ nvm สามารถอ่านต่อได้ที่บล็อกนี้ครับ) เพื่อไม่ให้เสียเวลาเรามาดูวิธีการใช้งานดีกว่าครับ
ติดตั้ง fvm
ขั้นแรกก่อนที่จะใช้งานเราจำเป็นต้องติดตั้ง fvm (ต้องมี Homebrew) ก่อนครับ

เลือกเวอร์ชันของ SDK
หลังจากติดตั้งเสร็จเรียบร้อยแล้ว เรามาเลือกเวอร์ชันของ SDK ที่ต้องการจะติดตั้งโดยการการใช้คำสั่ง fvm releases

ผมเลือกที่จะติดตั้ง SDK เวอร์ชัน 3.0.3 (stable) และ 2.13.0–0.1.pre(dev) จะต้องพิมพ์คำสั่ง fvm use <version>
ติดตั้ง Flutter SDK
ในการติดตั้ง Flutter SDK จะใช้คำสั่ง flutter install <version>

เรียกดูเวอร์ชันของ Flutter
เมื่อติดตั้งเสร็จสิ้น เราสามารถดูเวอร์ชันที่ติดตั้งด้วยการใช้คำสั่ง fvm list

เลือก Global version สำหรับ Flutter SDK
ทำได้ด้วยการใช้คำสั่ง fvm global <version>

สาเหตุที่จำเป็นต้องเซ็ทค่าไว้เพราะว่าถ้าเกิดเรารันคำสั่ง fvm flutter run และไม่เจอการตั้งค่าของโปรเจคในระดับ local แล้วละก็มันจะ fallback กลับมาที่ global version ครับ
สลับเวอร์ชันในระดับ local หรือระหว่างโปรเจค
สามารถทำได้โดยการใช้คำสั่ง fvm use <version>

เท่านี้เราก็จะได้ Flutter เวอร์ชัน stable และ dev อยู่ในเครื่องเดียวกันเรียบร้อย ส่วนต่อไปก็เป็น
สร้าง alias สำหรับคนขี้เกียจพิมพ์

เท่านี้เราก็สามารถใช้คำสั่ง f และ d โดยไม่ต้องพิมพ์เต็มว่า fvm flutter <command>หรือ fvm dart <command> เช่น

ประโยชน์ที่ได้จากการเรียกเรียก Flutter, dart ผ่าน fvm คือ fvm
จะมองหาก SDK ในแต่ละลำดับดังนี้
- Project
- Ancestor directory
- Global (Set through FVM)
- Environment (Flutter version configured on
PATH
)