ไปกันให้สุดซอยกับ Dart & Flutter

ภาษาดาร์ท (Dart)

ดาร์ท (Dart) เป็นภาษาที่อายุอานามประมาณบวกลบ 10 ปีได้ถือว่าเป็นภาษาโปรแกรมมิ่งที่ใหม่มาก ที่ประมวลเอาข้อดีของโปรแกรมรุ่นเก่าทั้งหลายทั้งมวล ส่วนฟลัตเตอร์ (Flutter) คือเฟรมเวิร์คสำหรับพัฒนาโปรแกรมแบบ cross platform ของกูเกิ้ลที่เขียนโค้ดครั้งเดียวสามารถนำไปรันได้ทั้ง วินโดส์ แมคโอเอส ลีนุกซ์ รวมทั้ง iOS และแอนดรอยด์ด้วย

กีวีเฟรมเวิร์คถึงคราวต้องจากกัน

หลังจากที่ลาจาก beeware ได้ไม่นาน สองสามเดือนก่อนหน้านี้ผมใช้เวลาพัฒนาแอพด้วยกีวีเฟรมเวิร์ค (Kivy framework) แต่อนิจจาอายุสั้นเหลือเกินสำหรับผมที่ต้องเท เพราะว่ามีบั๊กมากบางอย่างแก้ไม่ตก เครื่องมือบางอย่างเช่น mapview สำหรับแสดงแผนที่ก็ยังไปไม่สุดซอย ถ้าจะแฮ็คให้ใช้งานได้ต้องออกแรงมากเกินไปทำให้เสียเวลามาก เข้าใจว่าโครงการนี้มีทุนทรัพย์น้อย ชุมชนนักพัฒนาก็น้อยด้วย เท่าที่อ่านพบว่าทางผู้พัฒนาควักทุนทรัพย์ส่วนตัวมาพัฒนามามากกว่าสิบปี ตอนนี้ได้พยายามระดมทุนเพื่อมาช่วยให้โครงการให้ได้ไปต่อ

ข้อเสียอีกอย่างของกีวีเฟรมเวิร์คคือไม่สนับสนุนภาษาไทย การเรนเดอร์สระยังทำไม่ได้ถูกต้อง ตัวอย่างคำว่า “แผนที่” ไม้เอกจะลงมาทับสระอีทำให้อ่านเป็น “แผนที” ก็เป็นหนึ่งในเหตุผลที่ผมต้องไปต่อด้วยเครื่องมือตัวอื่น

ส่วนข้อดีของกีวีเฟรมเวิร์ค นอกจากที่ชอบเพราะโค้ดด้วยไพทอนแล้ว ภาษาที่ออกแบบ UI คือเขียนง่าย อ่านง่าย เข้าใจง่าย

เริ่มต้นใหม่กับภาษาดาร์ท

สองสามอาทิตย์กับที่ได้ค้นคว้าเริ่มเขียนโค้ดด้วยภาษาดาร์ท (Dart) ในตัวภาษาเองยอมรับว่าชอบ syntax กระชับมาก มีลิสต์และดิคชันนารีที่เรียกว่า map คล้ายไพทอน ส่วนใหญ่คล้ายจาวาหรือจาวาสคริปต์ ผมไม่เคยเขียนจาวามาก่อนเลยไม่ทราบว่าคล้ายขนาดไหน ดาร์ทเป็นภาษาที่ว่ากันว่าคือ Null safety โอกาสที่จะลืมใส่ null terminator แบบภาษาซีแทบจะไม่มี

ฟลัตเตอร์ (Flutter) รุงรังและเป็นนรกของวงเล็บ

ถ้ดมาคือฟลัตเตอร์ (Flutter) เอาโค้ดของดาร์ทมาสร้าง User Interface (UI) ที่รุงรังมาก อ่านเข้าใจยากและเป็นนรกของวงเล็บ (bracket hell) โดยแท้จริง มีคนกล่าวว่าฟลัตเตอร์เขียน UI ด้วยโค้ดของดาร์ท แทนที่จะแยก UI เป็นภาษามาร์คอัพแบบเครื่องมือเดฟตัวอื่นๆ

มีการ์ตูนล้อเลียนภาษา 8 ภาษา ที่สมมติว่าโปรแกรมเมอร์เป็นอัศวินจะไปช่วยเจ้าหญิงที่โดนขังอยู่ที่ปราสาท อัศวินโปรแกรมเมอร์แต่ละภาษาจะสามารถไปช่วยเจ้าหญิงได้หรือไม่ แต่ละภาษาก็มีลูกฮา หนึ่งในนั้นคือภาษา Lisp ที่เปิดรูปมาเป็นม้าขี่อัศวิน แทนที่อัศวินจะขี่ม้า ดูปุั๊บเก็ตปั๊บคือฮาเลย คือมันหนักมาก รูปถัดมาคืออัศวินล้มไปนอนคลานกับพื้นทำให้เห็นว่าม้าขี่เจ้าหญิงและเจ้าหญิงขี่อัศวินอีกที

ไปกันให้สุดปลายซอย

มุกเดียวกันมีคนแก้ Lisp เป็น Flutter ด้วยความที่เป็นนรกของวงเล็บเหมือนกัน สำหรับผมแล้วขัดเคืองนิดหน่อย ก็ต้องไปต่อด้วยดาร์ทกับฟลัตเตอร์ เพราะต้องการแอพเป็น native พร้อมกับความสวยงามรวมทั้งมีเครื่องไม้เครื่องมือแสดงแผนที่อย่างครบครัน ก็ต้องอดทนไปต่อกันให้สุดปลายซอย

เครดิต : liro.dev

ไลบรารีมากมายหลากหลาย

แรงใจการย้ายเข้ามาใช้ดาร์ทอีกทางคือ Proj4Dart ที่มีคนพอร์ตจากโครงการ Proj4js ที่เป็นจาวาสคริปต์ เป็นที่ทราบกันดีว่าการจะเขียนแอพด้าน geodesy ไลบรารีคำนวณด้านนี้ต้องยกให้ PROJ4 ที่เป็นเทพอยู่แล้ว แต่ช่วงที่ทดสอบโค้ดก็มาเจอแจ๊คพ็อต คือผมแปลงค่าพิกัดของงานรถไฟความเร็วสูงไทย-จีนด้วยไลบรารี Proj4Dart จากระบบ WGS84-TM และ WGS84-UTM พบว่า error ในการแปลงพิกัดมากถึง 30 ซม.กว่าๆ ทั้งที่ค่าพิกัดนี้โค้ดด้วยไพทอนใช้ไลบรารี pyproj กลับให้ค่าที่ถูกต้อง ได้แจ้งไปที่ผู้พัฒนา Proj4Dart ตอบกลับมาว่าทดสอบโค้ดแล้วได้ผลลัพธ์เหมือน Proj4js ผมต้องตามไปที่ Proj4js อีกที

รูปบนสุดแสดงการแปลงพิกัดด้วย Surveyor Pocket Tools โดยที่ใช้ไลบรารี pyproj รูปบนล่างซ้ายคือ Thai Geo Easy รุ่นที่พัฒนาด้วยกีวีเฟรมเวิร์ค ใช้ไลบรารี pygeodesy ส่วนรูปบนล่างขวามือคือ Thai Geo Easy รุ่นที่พัฒนาด้วยดาร์ทและฟลัตเตอร์ ใช้ไลบรารี Proj4Dart ซึ่งให้ค่าที่ผิดอยู่

ทดสอบการคำนวณจาก PROJ4 command line ต้นฉบับ ยืนยันว่าโค้ดที่พอร์ต Proj4js ผิดจริง

ระยะทางยังยาวไกล

ส่วนที่ยังไปไม่ถึงได้แก่ Mapview ของฟลัตเตอร์รวมถึงการติดต่ออุปกรณ์ต่างๆเช่น GPS ก็ยังมีเวลาอีกพอสมควรที่จะศึกษาและอิมพลีเมนต์ โดยรวมๆแล้วถึงจะขัดใจกับนรกวงเล็บของฟลัตเตอร์ แต่ในชุมชนก็มีการเสนอแบบแบ่งโค้ดออกมาเป็น widget เพื่อซอยโค้ดให้ย่อยและให้วงเล็บลดลงน้อยๆ เพื่อให้โค้ดอ่านง่าย โดยรวมแล้วผมก็ยังชอบภาษาดาร์ทและเฟรมเวิร์คฟลัตเตอร์ครับ โปรดติดตามกันตอนต่อไปครับ

2 thoughts on “ไปกันให้สุดซอยกับ Dart & Flutter”

    1. ยังไปไม่ได้ปล่อยลง google store หรือ apple store ประมาณต้นปีหน้าครับผม

Leave a Reply to priabroy Cancel reply

Your email address will not be published. Required fields are marked *