More
วิธีการใช้ Isolates ใน Flutter ร่วมกับ Back4app เพื่อตั้งรับการประมวลผลข้อมูลที่มีน้ำหนักมาก
12 นาที
บทนำ flutter เป็นเฟรมเวิร์กที่ทรงพลังสำหรับการสร้างแอปพลิเคชันข้ามแพลตฟอร์ม แต่เหมือนกับเฟรมเวิร์กมือถือหลายๆ ตัว มันจะรันโค้ดทั้งหมดในเธรดเดียวตามค่าเริ่มต้น เธรดนี้เรียกว่า ui thread ซึ่งมีหน้าที่ในการเรนเดอร์ ui ของแอปของคุณ เมื่อมีงานหนัก เช่น การประมวลผลข้อมูลหรือการจัดการไฟล์ เกิดขึ้นใน ui thread มันอาจทำให้แอปช้าหรือ "กระตุก" ส่งผลให้ประสบการณ์ของผู้ใช้แย่ลง เพื่อแก้ไขปัญหานี้ dart มีฟีเจอร์ที่เรียกว่า isolates isolates ช่วยให้คุณสามารถรันการคำนวณที่ใช้ทรัพยากรมากในเธรดแยก ทำให้ ui ของคุณตอบสนองได้ ในบทเรียนนี้ เราจะสำรวจวิธีการใช้ isolates ในแอปพลิเคชัน flutter เพื่อจัดการกับงานประมวลผลข้อมูลที่หนัก เช่น การแปลงไฟล์ json ขนาดใหญ่ที่ดึงมาจาก back4app backend ข้อกำหนดเบื้องต้น ในการทำตามบทแนะนำนี้ คุณจะต้องมี บัญชี back4app ลงทะเบียนสำหรับบัญชีฟรีที่ back4app com https //www back4app com ตั้งค่าสภาพแวดล้อมการพัฒนา flutter บนเครื่องของคุณ หากคุณยังไม่ได้ตั้งค่า ให้ทำตาม คู่มือการติดตั้ง flutter https //flutter dev/docs/get started/install ความรู้พื้นฐานเกี่ยวกับ dart, วิดเจ็ต flutter และการเขียนโปรแกรมแบบอะซิงโครนัส ขั้นตอนที่ 1 – การตั้งค่า backend ของ back4app ของคุณ สร้างโปรเจกต์ back4app เข้าสู่ระบบบัญชี back4app https //www back4app com/ และสร้างโปรเจกต์ใหม่ สร้างคลาส parse สำหรับบทแนะนำนี้ ให้สร้างคลาส parse ชื่อ record ที่เก็บข้อมูลจำนวนมาก title (string) ชื่อของบันทึก description (string) คำอธิบายของบันทึก metadata (json) เนื้อหาข้อมูลเมตาขนาดใหญ่ที่เกี่ยวข้องกับบันทึก เติมข้อมูลในคลาสด้วยข้อมูลตัวอย่าง เพิ่มบันทึกหลายรายการไปยัง record คลาสด้วยวัตถุ json ขนาดใหญ่ในฟิลด์ metadata สิ่งนี้จะจำลองประเภทของการประมวลผลข้อมูลที่อาจทำให้เกิดการกระตุกในแอปจริง รับข้อมูลประจำตัว back4app ของคุณ ไปที่การตั้งค่าโปรเจกต์ของคุณเพื่อดึงหมายเลขประจำตัวแอปพลิเคชันและคีย์ลูกค้า ซึ่งคุณจะต้องใช้ในการเชื่อมต่อแอป flutter ของคุณกับ back4app ขั้นตอนที่ 2 – การตั้งค่าโปรเจกต์ flutter ของคุณ สร้างโปรเจกต์ flutter ใหม่ เปิดเทอร์มินัลหรือพรอมต์คำสั่งของคุณและรัน flutter create isolate example เพิ่ม dependencies เปิด pubspec yaml และเพิ่ม dependencies ต่อไปนี้ dependencies flutter sdk flutter parse server sdk flutter latest version รัน flutter pub get เพื่อติดตั้ง dependencies เหล่านี้ เริ่มต้น parse ในแอปของคุณ ใน lib/main dart , นำเข้า parse sdk และเริ่มต้นใน ฟังก์ชัน main import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk flutter dart'; void main() async { widgetsflutterbinding ensureinitialized(); const keyapplicationid = 'your back4app app id'; const keyclientkey = 'your back4app client key'; const keyparseserverurl = 'https //parseapi back4app com'; await parse() initialize(keyapplicationid, keyparseserverurl, clientkey keyclientkey, autosendsessionid true); runapp(myapp()); } class myapp extends statelesswidget { @override widget build(buildcontext context) { return materialapp( home recordscreen(), ); } } แทนที่ 'your back4app app id' และ 'your back4app client key' ด้วยข้อมูลรับรอง back4app ที่แท้จริงของคุณ ขั้นตอนที่ 3 – ดึงข้อมูลจาก back4app สร้าง widget recordscreen ใน lib/main dart , สร้างหน้าจอใหม่ที่ดึงข้อมูลจาก back4app class recordscreen extends statefulwidget { @override recordscreenstate createstate() => recordscreenstate(); } class recordscreenstate extends state\<recordscreen> { list\<parseobject>? records; bool isloading = true; @override void initstate() { super initstate(); fetchrecords(); } future\<void> fetchrecords() async { final query = querybuilder\<parseobject>(parseobject('record')); final response = await query query(); if (response success && response results != null) { setstate(() { records = response results as list\<parseobject>; isloading = false; }); } } @override widget build(buildcontext context) { return scaffold( appbar appbar(title text('records')), body isloading ? center(child circularprogressindicator()) listview\ builder( itemcount records! length, itembuilder (context, index) { final record = records!\[index]; return listtile( title text(record get\<string>('title') ?? 'no title'), subtitle text(record get\<string>('description') ?? 'no description'), ); }, ), ); } } โค้ดนี้ดึงข้อมูลทั้งหมดจาก record คลาสใน back4app และแสดงในรายการ ขั้นตอนที่ 4 – การประมวลผลข้อมูลขนาดใหญ่ไปยัง isolate ใช้ isolate เพื่อแปลง json ขนาดใหญ่ สมมติว่า metadata ฟิลด์ในแต่ละระเบียนมีวัตถุ json ขนาดใหญ่ที่ต้องแปลง หากต้องการหลีกเลี่ยงการบล็อกเธรด ui เราจะใช้ isolate เพื่อทำงานนี้ import 'dart\ isolate'; import 'dart\ convert'; future\<map\<string, dynamic>> deserializejsoninisolate(string jsonstring) async { // spawning an isolate to perform json decoding final result = await isolate run(() { return jsondecode(jsonstring) as map\<string, dynamic>; }); return result; } future\<void> processrecord(parseobject record) async { string metadata = record get\<string>('metadata') ?? '{}'; // offload json deserialization to an isolate map\<string, dynamic> decodeddata = await deserializejsoninisolate(metadata); // do something with the decoded data print('processed metadata for ${record get\<string>('title')}'); } โค้ดนี้ดึงข้อมูลทั้งหมดจาก record คลาสใน back4app และแสดงในรายการ รวมการประมวลผล isolate เข้ากับแอป อัปเดต recordscreen วิดเจ็ตเพื่อประมวลผลข้อมูลเมตาของแต่ละบันทึกโดยใช้ isolate class recordscreenstate extends state\<recordscreen> { list\<parseobject>? records; bool isloading = true; @override void initstate() { super initstate(); fetchandprocessrecords(); } future\<void> fetchandprocessrecords() async { final query = querybuilder\<parseobject>(parseobject('record')); final response = await query query(); if (response success && response results != null) { list\<parseobject> fetchedrecords = response results as list\<parseobject>; // process each record's metadata using an isolate for (var record in fetchedrecords) { await processrecord(record); } setstate(() { records = fetchedrecords; isloading = false; }); } } @override widget build(buildcontext context) { return scaffold( appbar appbar(title text('records')), body isloading ? center(child circularprogressindicator()) listview\ builder( itemcount records! length, itembuilder (context, index) { final record = records!\[index]; return listtile( title text(record get\<string>('title') ?? 'no title'), subtitle text(record get\<string>('description') ?? 'no description'), ); }, ), ); } } การดำเนินการนี้ดึงบันทึกจาก back4app, ส่งงานการแปลง json ที่หนักไปยัง isolate, และอัปเดต ui เมื่อการประมวลผลเสร็จสิ้น ขั้นตอนที่ 5 – การทดสอบและการรันแอปของคุณ เรียกใช้แอปของคุณ โดยใช้ flutter run คุณควรเห็นรายการของบันทึกที่ดึงมาจาก back4app ข้อมูลเมตาสำหรับแต่ละบันทึกจะถูกประมวลผลใน isolate แยกต่างหาก เพื่อให้แน่ใจว่า ui ยังคงราบรื่นและตอบสนองได้ดี ตรวจสอบประสิทธิภาพ โดยการทดสอบด้วยไฟล์ json ขนาดใหญ่ในฟิลด์ข้อมูลเมตา สังเกตว่าการใช้ isolates ช่วยป้องกันการกระตุกและทำให้ ui ตอบสนองได้ดี บทสรุป ในบทเรียนนี้ คุณได้เรียนรู้วิธีการใช้ isolates ใน flutter เพื่อจัดการกับงานประมวลผลข้อมูลที่หนัก เช่น การแปลงไฟล์ json ขนาดใหญ่ โดยการส่งมอบงานเหล่านี้ไปยัง isolate คุณจะทำให้เธรด ui ว่างเพื่อจัดการกับการเรนเดอร์ ส่งผลให้แอปมีความราบรื่นและตอบสนองได้ดีขึ้น การรวม back4app เป็นแบ็กเอนด์ช่วยให้คุณจัดการและดึงข้อมูลได้อย่างมีประสิทธิภาพ ในขณะที่โมเดล isolate ของ dart ทำให้แน่ใจว่าแอปของคุณยังคงมีประสิทธิภาพแม้จะจัดการกับการดำเนินการที่ซับซ้อน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ flutter กับ back4app โปรดดูที่ เอกสาร back4app https //www back4app com/docs และ เอกสาร flutter https //flutter dev/docs ขอให้สนุกกับการเขียนโค้ด!