Flutter
GraphQL
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” untuk memahami titik awal kami di panduan ini kami akan menggunakan proyek sebelumnya jika anda tidak memilikinya anda dapat mengunduh di sini sebuah ide untuk menulis kode flutter seperti android studio atau vs code akun back4app yang dapat dibuat di sini 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 mutation page dart mutation page dart di sini kita akan membuat gui kita untuk mengambil input dari pengguna dan melakukan tugas mutasi sekarang tempelkan kode berikut di mutation page dart mutation page dart 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 } appui() appui() widget sudah dibuat untuk anda jadi kami telah membuat kelas bernama mutationpage mutationpage dan mengembalikan appui appui widget sebagai widgetnya kami juga telah menginisialisasi fungsi callback untuk text fields kami sehingga teks di textfield pertama akan disimpan di langname langname , yang kedua di saveformat saveformat dan objectid objectid dari yang terakhir sekarang lanjutkan ke main dart main dart dan tambahkan parameter floatingactionbutton floatingactionbutton di scaffold() scaffold() widget dari myhomepage myhomepage 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 mutationpage() mutationpage() dari halaman beranda kita jadi sekarang gui kita sudah siap anda sekarang dapat memulai ulang aplikasi anda untuk melihat gui inilah bagaimana main dart main dart 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 graphql configration dart graphql configration dart anda akan melihat bahwa kami sudah mengatur graphqlclient graphqlclient dan sekarang kita bisa menggunakannya di mana saja mari kita lanjutkan dan buat file database utils dart database utils dart dan lakukan operasi untuk membuat data buat kelas databaseutils{} databaseutils{} dan buat konstruktor yang akan menerima parameter data yang akan kita kerjakan, di sini kita akan memerlukan langname langname , saveformat saveformat , dan objectid objectid 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 adddata() adddata() yang akan menjadi fungsi asinkron untuk membuat data dan menginisialisasi graphqlclient graphqlclient dengan menginisialisasi graphqlconfigration graphqlconfigration kelas tempelkan kode berikut ke dalam senddata() senddata() 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 adddata adddata dan telah mengirimkan kueri untuk membuat data dan menginisialisasi variabel variabel yang akan mengirimkan variabel kueri kami juga menginisialisasi graphqlclient graphqlclient 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 graphqlclient graphqlclient instance kami untuk menulis kueri yang menerima queryoptions() queryoptions() yang membantu kami untuk mengirimkan kueri seperti yang telah anda lihat dari tutorial terakhir hasilnya disimpan di queryresult queryresult inilah bagaimana database utils dart database utils dart 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 mutation page dart mutation page dart mari kita kode untuk tombol kirim data yang dapat dikodekan di dalam senddatabuttonpressed senddatabuttonpressed parameter karena kita perlu langname dan saveformat, pertama periksa apakah itu tidak kosong dan kemudian buat instance dari databaseutils databaseutils dan kemudian berikan langname langname dan saveformat saveformat parameter 1 if(langname isnotempty && saveformat isnotempty){ 2 utils = databaseutils( 3 langname langname, 4 saveformat saveformat , 5 ); 6 } setelah ini panggil senddata() senddata() fungsi dari databaseutils databaseutils instance 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 databaseutils databaseutils buat sebuah future future fungsi updatedata() updatedata() inisialisasi sebuah string update string update dan masukkan kueri pembaruan dan variabel kueri dalam variabel final variabel final 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 graphqlclient graphqlclient kita dan kirim kueri melalui queryoptions() queryoptions() 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 mutaion page dart mutaion page dart dan kode di updatebuttonpressed updatebuttonpressed parameter periksa apakah langname langname , objectid objectid dan saveformat saveformat tidak kosong dan kemudian panggil updatedata() updatedata() fungsi dari databaseutils databaseutils 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 deletedata() deletedata() fungsi unhandled content type async di databaseutils databaseutils dan inisialisasi string delete string delete dan kirimkan kueri graphql untuk menghapus data ambil variabel final variabel final 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 objectid objectid dari baris yang perlu dihapus inisialisasi graphqlclient graphqlclient dan kirimkan kueri melalui queryoptions() queryoptions() 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 mutationpage mutationpage di deletedatabuttonpressed deletedatabuttonpressed parameter periksa jika objectid objectid tidak kosong atau null dan panggil deletedata() deletedata() fungsi hot restart aplikasi, masukkan objectid dari baris yang akan dihapus dan tekan tombol delete data itu harus menghapus baris tertentu dari language language kelas berhasil aplikasi anda akhirnya telah menyelesaikan operasi mutasi anda !!! main dart main dart 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 } database utils dart database utils dart 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 } mutaion page dart mutaion page dart 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!