Implementasi CRUD di Flutter dengan GraphQL
18 mnt
contoh aplikasi flutter crud menggunakan graphql pendahuluan dalam panduan flutter graphql pertama kami, kami telah belajar bagaimana cara mengatur proyek flutter menggunakan api graphql untuk menghubungkan dan mengquery data sederhana di back4app juga, bagaimana kami dapat menggunakan back4app graphql playground untuk menjalankan query/mutasi untuk membuat/mengisi database aplikasi dalam tutorial ini, kami akan menambahkan fitur di mana kami akan langsung membuat, memperbarui, dan menghapus data dari backend back4app kami langsung dari aplikasi kami menggunakan mutasi graphql tujuan di akhir artikel ini kami berharap anda akan dapat membuat data di backend kami menggunakan api graphql memperbarui data dari backend kami menggunakan api graphql menghapus data yang ada dari backend menggunakan api graphql prasyarat untuk menyelesaikan tutorial ini, anda akan membutuhkan anda perlu membaca panduan kami sebelumnya “proyek graphql flutter” https //www back4app com/docs/flutter/graphql/flutter graphql project with source code download untuk memahami titik awal kami di panduan ini kami akan menggunakan proyek sebelumnya jika anda tidak memilikinya anda dapat mengunduh di sini https //github com/templates back4app/flutter graphql sebuah ide untuk menulis kode flutter seperti android studio atau vs code akun back4app yang dapat dibuat di sini https //www back4app com/ ketergantungan back4app graphql flutter https //pub dev/packages/graphql flutter catatan jika anda ingin pemahaman yang lebih baik tentang api graphql back4app lihatlah buku masak graphql https //www back4app com/docs/parse graphql/graphql getting started dan juga periksa skema graphql kami di api playground kami 1 menyiapkan gui buat file baru \<font color="#2166ae">mutation page dart\</font> di sini kita akan membuat gui kita untuk mengambil input dari pengguna dan melakukan tugas mutasi sekarang tempelkan kode berikut di \<font color="#2166ae">mutation page dart\</font> 1 import 'package\ back4appgraphqldemo/app ui dart'; 2 import 'package\ back4appgraphqldemo/database utils dart'; 3 import 'package\ flutter/material dart'; 4 5 class mutationpage extends statelesswidget { 6 7 string langname,saveformat,objectid; 8 databaseutils utils; 9 10 @override 11 widget build(buildcontext context) { 12 return appui( 13 onchangedname (text){ 14 langname=text; 15 }, 16 onchangedsaveformat (text){ 17 saveformat=text; 18 }, 19 onchangedobjectid (text){ 20 objectid=text; 21 }, 22 senddatabuttonpressed (){ 23 }, 24 deletedatabuttonpressed (){ 25 }, 26 updatebuttonpressed (){ 27 }, 28 ); 29 } 30 } \<font color="#2166ae">appui()\</font> widget sudah dibuat untuk anda jadi kami telah membuat kelas bernama \<font color="#2166ae">mutationpage\</font> dan mengembalikan \<font color="#2166ae">appui\</font> widget sebagai widgetnya kami juga telah menginisialisasi fungsi callback untuk text fields kami sehingga teks di textfield pertama akan disimpan di \<font color="#2166ae">langname\</font> , yang kedua di \<font color="#2166ae">saveformat\</font> dan \<font color="#2166ae">objectid\</font> dari yang terakhir sekarang lanjutkan ke \<font color="#2166ae">main dart\</font> dan tambahkan parameter \<font color="#2166ae">floatingactionbutton\</font> di \<font color="#2166ae">scaffold()\</font> widget dari \<font color="#2166ae">myhomepage\</font> kelas dan masukkan kode berikut ke dalamnya 1 floatingactionbutton row( 2 mainaxisalignment mainaxisalignment end, 3 children \[ 4 floatingactionbutton( 5 herotag 'mutation page', 6 child text('m', 7 style textstyle( 8 color colors white, 9 ), 10 ), 11 onpressed (){ 12 navigator pushreplacement(context, materialpageroute( 13 builder ((context){ 14 return mutationpage(); 15 }) 16 )); 17 }, 18 ), 19 ], 20 ), ini akan membuat sebuah tombol mengambang yang akan menavigasi kita ke \<font color="#2166ae">mutationpage()\</font> dari halaman beranda kita jadi sekarang gui kita sudah siap anda sekarang dapat memulai ulang aplikasi anda untuk melihat gui inilah bagaimana \<font color="#2166ae">main dart\</font> anda seharusnya terlihat 1 import 'package\ back4appgraphqldemo/mutation page dart'; 2 import 'package\ flutter/material dart'; 3 import 'package\ graphql flutter/graphql flutter dart'; 4 import 'consonents dart'; 5 import 'dart\ ui'; 6 7 void main() { 8 runapp(myapp()); 9 } 10 11 class myapp extends statelesswidget { 12 @override 13 widget build(buildcontext context) { 14 final httplink httplink = httplink( 15 uri 'https //parseapi back4app com/graphql', 16 headers { 17 'x parse application id' kparseapplicationid, 18 'x parse client key' kparseclientkey, 19 'x parse master key' kparsemasterkey, 20 //'x parse rest api key' kparserestapikey, 21 }, //getheaders() 22 ); 23 24 valuenotifier\<graphqlclient> client = valuenotifier( 25 graphqlclient( 26 cache optimisticcache(dataidfromobject typenamedataidfromobject), 27 link httplink, 28 ), 29 ); 30 31 return materialapp( 32 home graphqlprovider( 33 child myhomepage(), 34 client client, 35 ), 36 ); 37 } 38 } 39 40 class myhomepage extends statefulwidget { 41 @override 42 myhomepagestate createstate() => myhomepagestate(); 43 } 44 45 class myhomepagestate extends state\<myhomepage> { 46 string name; 47 string saveformat; 48 string objectid; 49 50 string query = ''' 51 query findlanguages{ 52 languages{ 53 count, 54 edges{ 55 node{ 56 name, 57 saveformat 58 } 59 } 60 } 61 } 62 '''; 63 64 @override 65 widget build(buildcontext context) { 66 return safearea( 67 child scaffold( 68 appbar appbar( 69 title text( 70 'parsing data using graphql', 71 ), 72 ), 73 floatingactionbutton row( 74 mainaxisalignment mainaxisalignment end, 75 children \[ 76 floatingactionbutton( 77 herotag 'mutation page', 78 child text('m', 79 style textstyle( 80 color colors white, 81 ), 82 ), 83 onpressed (){ 84 navigator pushreplacement(context, materialpageroute( 85 builder ((context){ 86 return mutationpage(); 87 }) 88 )); 89 }, 90 ), 91 ], 92 ), 93 body query( 94 options queryoptions( 95 documentnode gql(query), 96 ), 97 builder ( 98 queryresult result, { 99 refetch refetch, 100 fetchmore fetchmore, 101 }) { 102 if (result data == null) { 103 return center( 104 child text( 105 "loading ", 106 style textstyle(fontsize 20 0), 107 )); 108 } else { 109 return listview\ builder( 110 itembuilder (buildcontext context, int index) { 111 return listtile( 112 title text(result data\["languages"]\["edges"]\[index]\["node"] 113 \['name']), 114 trailing text(result data\["languages"]\["edges"]\[index] 115 \["node"]\['saveformat']), 116 117 ); 118 }, 119 itemcount result data\["languages"]\["edges"] length, 120 ); 121 } 122 }, 123 ), 124 ), 125 ); 126 } 127 } 2 membuat/menambahkan data ke database jika anda melanjutkan ke \<font color="#2166ae">graphql configration dart\</font> anda akan melihat bahwa kami sudah mengatur \<font color="#2166ae">graphqlclient\</font> dan sekarang kita bisa menggunakannya di mana saja mari kita lanjutkan dan buat file \<font color="#2166ae">database utils dart\</font> dan lakukan operasi untuk membuat data buat kelas \<font color="#2166ae">databaseutils{}\</font> dan buat konstruktor yang akan menerima parameter data yang akan kita kerjakan, di sini kita akan memerlukan \<font color="#2166ae">langname\</font> , \<font color="#2166ae">saveformat\</font> , dan \<font color="#2166ae">objectid\</font> 1 import 'package\ back4appgraphqldemo/graphql configration dart'; 2 import 'package\ graphql flutter/graphql flutter dart'; 3 4 class databaseutils{ 5 final string langname,saveformat,objectid; 6 databaseutils({this langname="",this saveformat="",this objectid=""}); 7 } buat fungsi \<font color="#2166ae">adddata()\</font> yang akan menjadi fungsi asinkron untuk membuat data dan menginisialisasi \<font color="#2166ae">graphqlclient\</font> dengan menginisialisasi \<font color="#2166ae">graphqlconfigration\</font> kelas tempelkan kode berikut ke dalam \<font color="#2166ae">senddata()\</font> fungsi 1 future\<queryresult> senddata() async{ 2 string adddata=''' 3 mutation createobject(\\$input createlanguagefieldsinput){ 4 createlanguage(input {fields \\$input}){ 5 language{ 6 name, 7 saveformat 8 } 9 } 10 } 11 '''; 12 final variable ={ 13 "input" { 14 "name" langname, 15 "saveformat" saveformat, 16 } 17 }; 18 19 graphqlconfiguration configuration = graphqlconfiguration(); 20 graphqlclient client = configuration clienttoquery(); 21 22 } di sini kami telah menginisialisasi sebuah variabel \<font color="#2166ae">adddata\</font> dan telah mengirimkan kueri untuk membuat data dan menginisialisasi \<font color="#2166ae">variabel\</font> yang akan mengirimkan variabel kueri kami juga menginisialisasi \<font color="#2166ae">graphqlclient\</font> yang akan membantu kami untuk mengirimkan kueri kami dapat mengirimkan kueri dengan cara di bawah ini 1 queryresult queryresult = await client query( 2 queryoptions(documentnode gql(adddata), variables variable), 3 ); 4 return queryresult; kami menggunakan \<font color="#2166ae">graphqlclient\</font> instance kami untuk menulis kueri yang menerima \<font color="#2166ae">queryoptions()\</font> yang membantu kami untuk mengirimkan kueri seperti yang telah anda lihat dari tutorial terakhir hasilnya disimpan di \<font color="#2166ae">queryresult\</font> inilah bagaimana \<font color="#2166ae">database utils dart\</font> anda seharusnya terlihat 1 import 'package\ back4appgraphqldemo/graphql configration dart'; 2 import 'package\ graphql flutter/graphql flutter dart'; 3 4 class databaseutils{ 5 final string langname,saveformat,objectid; 6 databaseutils({this langname="",this saveformat="",this objectid=""}); 7 future\<queryresult> senddata() async{ 8 string adddata=''' 9 mutation createobject(\\$input createlanguagefieldsinput){ 10 createlanguage(input {fields \\$input}){ 11 language{ 12 name, 13 saveformat 14 } 15 } 16 } 17 '''; 18 final variable ={ 19 "input" { 20 "name" langname, 21 "saveformat" saveformat, 22 } 23 }; 24 25 graphqlconfiguration configuration = graphqlconfiguration(); 26 graphqlclient client = configuration clienttoquery(); 27 28 queryresult queryresult = await client query( 29 queryoptions(documentnode gql(adddata), variables variable), 30 ); 31 return queryresult; 32 } 33 } sekarang lanjutkan ke kelas ui anda \<font color="#2166ae">mutation page dart\</font> mari kita kode untuk tombol kirim data yang dapat dikodekan di dalam \<font color="#2166ae">senddatabuttonpressed \</font> parameter karena kita perlu langname dan saveformat, pertama periksa apakah itu tidak kosong dan kemudian buat instance dari \<font color="#2166ae">databaseutils\</font> dan kemudian berikan \<font color="#2166ae">langname\</font> dan \<font color="#2166ae">saveformat\</font> parameter 1 if(langname isnotempty && saveformat isnotempty){ 2 utils = databaseutils( 3 langname langname, 4 saveformat saveformat , 5 ); 6 } setelah ini panggil \<font color="#2166ae">senddata()\</font> fungsi dari \<font color="#2166ae">databaseutils\</font> instance utils senddata(); sekarang anda dapat hot restart aplikasi, isi dua kolom teks dengan data masing masing dan tekan tombol kirim data sekarang kembali ke halaman query anda dengan menekan tombol aksi mengambang dan anda dapat melihat satu data lagi ditambahkan ke tabel kami inilah tampilan kelas mutationpage anda 1 import 'package\ back4appgraphqldemo/app ui dart'; 2 import 'package\ back4appgraphqldemo/database utils dart'; 3 import 'package\ flutter/material dart'; 4 5 class mutationpage extends statelesswidget { 6 7 string langname,saveformat,objectid; 8 databaseutils utils; 9 10 @override 11 widget build(buildcontext context) { 12 return appui( 13 onchangedname (text){ 14 langname=text; 15 }, 16 onchangedsaveformat (text){ 17 saveformat=text; 18 }, 19 onchangedobjectid (text){ 20 objectid=text; 21 }, 22 senddatabuttonpressed (){ 23 if(langname isnotempty && saveformat isnotempty){ 24 utils = databaseutils( 25 langname langname, 26 saveformat saveformat , 27 ); 28 utils senddata(); 29 } 30 }, 31 deletedatabuttonpressed (){ 32 }, 33 updatebuttonpressed (){ 34 }, 35 ); 36 } 37 } 3 memperbarui data di \<font color="#2166ae">databaseutils\</font> buat sebuah \<font color="#2166ae">future\</font> fungsi \<font color="#2166ae">updatedata()\</font> inisialisasi sebuah \<font color="#2166ae">string update\</font> dan masukkan kueri pembaruan dan variabel kueri dalam \<font color="#2166ae">variabel final\</font> 1 future\<queryresult> updatedata() async{ 2 string update=''' 3 mutation updateobject(\\$id id!,\\$input updatelanguagefieldsinput){ 4 updatelanguage(input {id \\$id, fields \\$input}){ 5 language{ 6 name, 7 id 8 } 9 } 10 } 11 '''; 12 final variable={ 13 "id"\ objectid, 14 "input" { 15 "name" langname 16 } 17 }; 18 } sekarang inisialisasi \<font color="#2166ae">graphqlclient\</font> kita dan kirim kueri melalui \<font color="#2166ae">queryoptions()\</font> begini cara kode anda akan terlihat 1 future\<queryresult> updatedata() async{ 2 3 string update=''' 4 mutation updateobject(\\$id id!,\\$input updatelanguagefieldsinput){ 5 updatelanguage(input {id \\$id, fields \\$input}){ 6 language{ 7 name, 8 id 9 } 10 } 11 } 12 '''; 13 14 final variable={ 15 "id"\ objectid, 16 "input" { 17 "name" langname 18 } 19 }; 20 21 graphqlconfiguration configuration = graphqlconfiguration(); 22 graphqlclient client = configuration clienttoquery(); 23 24 queryresult queryresult = await client query( 25 queryoptions(documentnode gql(update), variables variable), 26 ); 27 return queryresult; 28 } sekarang kembali ke \<font color="#2166ae">mutaion page dart\</font> dan kode di \<font color="#2166ae">updatebuttonpressed \</font> parameter periksa apakah \<font color="#2166ae">langname\</font> , \<font color="#2166ae">objectid\</font> dan \<font color="#2166ae">saveformat\</font> tidak kosong dan kemudian panggil \<font color="#2166ae">updatedata() \</font> fungsi dari \<font color="#2166ae">databaseutils\</font> kelas 1 updatebuttonpressed (){ 2 if(langname isnotempty && saveformat isnotempty && objectid isnotempty){ 3 utils = databaseutils( 4 langname langname, 5 saveformat saveformat , 6 objectid objectid 7 ); 8 utils updatedata(); 9 } 10 }, pergi ke dasbor back4app dan pilih bahasa untuk diperbarui, lalu salin objectid nya hot restart aplikasi anda dan isi semua 3 kolom teks nama baru dari bahasa yang ingin anda masukkan di kolom teks pertama dan save format baru di kolom kedua dan objectid di kolom ketiga sekarang tekan tombol perbarui data dan periksa informasi yang diperbarui di aplikasi dengan mengklik tombol aksi mengambang q di kanan bawah 4 menghapus data buat sebuah \<font color="#2166ae">deletedata()\</font> fungsi unhandled content type async di \<font color="#2166ae">databaseutils\</font> dan inisialisasi \<font color="#2166ae">string delete\</font> dan kirimkan kueri graphql untuk menghapus data ambil \<font color="#2166ae">variabel final\</font> dan masukkan variabel kueri ke dalamnya 1 future\<queryresult> deletedata() async{ 2 string delete=''' 3 mutation deleteobject(\\$id id!){ 4 deletelanguage(input {id \\$id}){ 5 language{ 6 name, 7 id 8 } 9 } 10 } 11 '''; 12 final variable={ 13 "id"\ objectid, 14 }; 15 } dalam hal ini, kita hanya memerlukan \<font color="#2166ae">objectid\</font> dari baris yang perlu dihapus inisialisasi \<font color="#2166ae">graphqlclient\</font> dan kirimkan kueri melalui \<font color="#2166ae">queryoptions()\</font> 1 future\<queryresult> deletedata() async{ 2 string delete=''' 3 mutation deleteobject(\\$id id!){ 4 deletelanguage(input {id \\$id}){ 5 language{ 6 name, 7 id 8 } 9 } 10 } 11 '''; 12 final variable={ 13 "id"\ objectid, 14 }; 15 16 graphqlconfiguration configuration = graphqlconfiguration(); 17 graphqlclient client = configuration clienttoquery(); 18 19 queryresult queryresult = await client query( 20 queryoptions(documentnode gql(delete), variables variable), 21 ); 22 23 return queryresult; 24 } di \<font color="#2166ae">mutationpage\</font> di \<font color="#2166ae">deletedatabuttonpressed\</font> parameter periksa jika \<font color="#2166ae">objectid\</font> tidak kosong atau null dan panggil \<font color="#2166ae">deletedata()\</font> fungsi hot restart aplikasi, masukkan objectid dari baris yang akan dihapus dan tekan tombol delete data itu harus menghapus baris tertentu dari \<font color="#2166ae">language\</font> kelas berhasil aplikasi anda akhirnya telah menyelesaikan operasi mutasi anda !!! \<font color="#2166ae">main dart\</font> harus terlihat seperti ini 1 import 'package\ back4appgraphqldemo/mutation page dart'; 2 import 'package\ flutter/material dart'; 3 import 'package\ graphql flutter/graphql flutter dart'; 4 import 'consonents dart'; 5 import 'dart\ ui'; 6 7 void main() { 8 runapp(myapp()); 9 } 10 11 class myapp extends statelesswidget { 12 @override 13 widget build(buildcontext context) { 14 final httplink httplink = httplink( 15 uri 'https //parseapi back4app com/graphql', 16 headers { 17 'x parse application id' kparseapplicationid, 18 'x parse client key' kparseclientkey, 19 'x parse master key' kparsemasterkey, 20 //'x parse rest api key' kparserestapikey, 21 }, //getheaders() 22 ); 23 24 valuenotifier\<graphqlclient> client = valuenotifier( 25 graphqlclient( 26 cache optimisticcache(dataidfromobject typenamedataidfromobject), 27 link httplink, 28 ), 29 ); 30 31 return materialapp( 32 home graphqlprovider( 33 child myhomepage(), 34 client client, 35 ), 36 ); 37 } 38 } 39 40 class myhomepage extends statefulwidget { 41 @override 42 myhomepagestate createstate() => myhomepagestate(); 43 } 44 45 class myhomepagestate extends state\<myhomepage> { 46 string name; 47 string saveformat; 48 string objectid; 49 50 string query = ''' 51 query findlanguages{ 52 languages{ 53 count, 54 edges{ 55 node{ 56 name, 57 saveformat 58 } 59 } 60 } 61 } 62 '''; 63 64 @override 65 widget build(buildcontext context) { 66 return safearea( 67 child scaffold( 68 appbar appbar( 69 title text( 70 'parsing data using graphql', 71 ), 72 ), 73 floatingactionbutton row( 74 mainaxisalignment mainaxisalignment end, 75 children \[ 76 floatingactionbutton( 77 herotag 'mutation page', 78 child text('m', 79 style textstyle( 80 color colors white, 81 ), 82 ), 83 onpressed (){ 84 navigator pushreplacement(context, materialpageroute( 85 builder ((context){ 86 return mutationpage(); 87 }) 88 )); 89 }, 90 ), 91 ], 92 ), 93 body query( 94 options queryoptions( 95 documentnode gql(query), 96 ), 97 builder ( 98 queryresult result, { 99 refetch refetch, 100 fetchmore fetchmore, 101 }) { 102 if (result data == null) { 103 return center( 104 child text( 105 "loading ", 106 style textstyle(fontsize 20 0), 107 )); 108 } else { 109 return listview\ builder( 110 itembuilder (buildcontext context, int index) { 111 return listtile( 112 title text(result data\["languages"]\["edges"]\[index]\["node"] 113 \['name']), 114 trailing text(result data\["languages"]\["edges"]\[index] 115 \["node"]\['saveformat']), 116 117 ); 118 }, 119 itemcount result data\["languages"]\["edges"] length, 120 ); 121 } 122 }, 123 ), 124 ), 125 ); 126 } 127 } \<font color="#2166ae">database utils dart\</font> harus seperti ini 1 import 'package\ back4appgraphqldemo/graphql configration dart'; 2 import 'package\ graphql flutter/graphql flutter dart'; 3 4 class databaseutils{ 5 6 final string langname,saveformat,objectid; 7 8 databaseutils({this langname="",this saveformat="",this objectid=""}); 9 10 string delete=''' 11 mutation delete languages(\\$id id!){ 12 deletelanguage(input {id \\$id}){ 13 language{ 14 name, 15 id 16 } 17 } 18 } 19 '''; 20 21 string adddata=''' 22 mutation create languages(\\$input createlanguagefieldsinput){ 23 createlanguage(input {fields \\$input}){ 24 language{ 25 name, 26 saveformat 27 } 28 } 29 } 30 '''; 31 string update=''' 32 mutation update languages(\\$id id!,\\$input updatelanguagefieldsinput){ 33 updatelanguage(input {id \\$id, fields \\$input}){ 34 language{ 35 name, 36 id 37 } 38 } 39 } 40 '''; 41 42 future\<queryresult> senddata() async{ 43 44 final variable ={ 45 "input" { 46 "name" langname, 47 "saveformat" saveformat, 48 } 49 }; 50 print('sendingdata'); 51 52 graphqlconfiguration configuration = graphqlconfiguration(); 53 graphqlclient client = configuration clienttoquery(); 54 55 queryresult queryresult = await client query( 56 queryoptions(documentnode gql(adddata), variables variable), 57 ); 58 return queryresult; 59 60 } 61 future\<queryresult> updatedata() async{ 62 final variable={ 63 "id"\ objectid, 64 "input" { 65 "name" langname 66 } 67 }; 68 69 graphqlconfiguration configuration = graphqlconfiguration(); 70 graphqlclient client = configuration clienttoquery(); 71 72 queryresult queryresult = await client query( 73 queryoptions(documentnode gql(update), variables variable), 74 ); 75 return queryresult; 76 } 77 78 79 future\<queryresult> deletedata() async{ 80 final variable={ 81 "id"\ objectid, 82 }; 83 84 graphqlconfiguration configuration = graphqlconfiguration(); 85 graphqlclient client = configuration clienttoquery(); 86 87 queryresult queryresult = await client query( 88 queryoptions(documentnode gql(delete), variables variable), 89 ); 90 91 return queryresult; 92 } 93 } \<font color="#2166ae">mutaion page dart\</font> harus terlihat seperti ini 1 import 'package\ back4appgraphqldemo/app ui dart'; 2 import 'package\ back4appgraphqldemo/database utils dart'; 3 import 'package\ flutter/material dart'; 4 5 class mutationpage extends statelesswidget { 6 7 string langname,saveformat,objectid; 8 databaseutils utils; 9 10 @override 11 widget build(buildcontext context) { 12 return appui( 13 onchangedname (text){ 14 langname=text; 15 }, 16 onchangedsaveformat (text){ 17 saveformat=text; 18 }, 19 onchangedobjectid (text){ 20 objectid=text; 21 }, 22 23 senddatabuttonpressed (){ 24 if(langname isnotempty && saveformat isnotempty){ 25 utils = databaseutils( 26 langname langname, 27 saveformat saveformat , 28 ); 29 utils senddata(); 30 } 31 }, 32 deletedatabuttonpressed (){ 33 if(objectid isnotempty){ 34 utils = databaseutils( 35 objectid objectid, 36 ); 37 utils deletedata(); 38 } 39 }, 40 updatebuttonpressed (){ 41 if(langname isnotempty && saveformat isnotempty && objectid isnotempty){ 42 utils = databaseutils( 43 langname langname, 44 saveformat saveformat , 45 objectid objectid 46 ); 47 utils updatedata(); 48 } 49 }, 50 ); 51 } 52 } kesimpulan dalam panduan ini kami menggunakan mutasi graphql dalam aplikasi flutter untuk membuat objek baru di back4app; memperbarui objek di back4app; menghapus objek di back4app pada titik ini anda memiliki proyek crud graphql flutter yang sepenuhnya fungsional di mana anda dapat menggunakannya sebagai titik awal untuk mengembangkan aplikasi anda berikutnya dalam panduan berikutnya, kami akan menyelami lebih dalam ke dalam kueri yang menunjukkan cara membuatnya untuk mengambil data dari back4app dan menampilkannya di aplikasi flutter kami semoga harimu menyenangkan!