जनरेट किए गए Flutter SDK टूल का इस्तेमाल करना

Firebase SQL Connect क्लाइंट SDK टूल की मदद से, Firebase ऐप्लिकेशन से सीधे अपने सर्वर-साइड क्वेरी और म्यूटेशन कॉल किए जा सकते हैं. SQL Connect सेवा पर डिप्लॉय किए जाने वाले स्कीमा, क्वेरी, और म्यूटेशन डिज़ाइन करते समय, कस्टम क्लाइंट SDK टूल जनरेट किया जाता है.SQL Connect इसके बाद, इस SDK टूल के तरीकों को अपने क्लाइंट लॉजिक में इंटिग्रेट किया जाता है.

जैसा कि हमने कहीं और बताया है, यह ध्यान रखना ज़रूरी है कि SQL Connect क्वेरी और म्यूटेशन, क्लाइंट कोड से सबमिट नहीं किए जाते. इन्हें सर्वर पर एक्ज़ीक्यूट किया जाता है. इसके बजाय, डिप्लॉय किए जाने पर, SQL Connect ऑपरेशन सर्वर पर सेव किए जाते हैं. जैसे, Cloud Functions. इसका मतलब है कि आपको क्लाइंट-साइड में किए गए बदलावों को डिप्लॉय करना होगा, ताकि मौजूदा उपयोगकर्ताओं को कोई समस्या न हो. उदाहरण के लिए, ऐप्लिकेशन के पुराने वर्शन इस्तेमाल करने वाले उपयोगकर्ताओं को.

इसलिए, SQL Connect आपको डेवलपर एनवायरमेंट और टूलिंग उपलब्ध कराता है. इसकी मदद से, सर्वर पर डिप्लॉय किए गए स्कीमा, क्वेरी, और म्यूटेशन का प्रोटोटाइप बनाया जा सकता है. प्रोटोटाइप बनाते समय, यह क्लाइंट-साइड SDK टूल अपने-आप जनरेट करता है.

जब आपकी सेवा और क्लाइंट ऐप्लिकेशन के अपडेट को दोहराया जाता है, तब सर्वर और क्लाइंट-साइड, दोनों के अपडेट डिप्लॉय किए जा सकते हैं.

क्लाइंट डेवलपमेंट का वर्कफ़्लो क्या है?

शुरू करें लेख में, आपको के लिए डेवलपमेंट के पूरे फ़्लो के बारे में बताया गया था.SQL Connect इस गाइड में, आपको अपने स्कीमा से Flutter SDK टूल जनरेट करने और क्लाइंट क्वेरी और म्यूटेशन के साथ काम करने के बारे में ज़्यादा जानकारी मिलेगी.

संक्षेप में, अपने क्लाइंट ऐप्लिकेशन में जनरेट किए गए Flutter SDK टूल का इस्तेमाल करने के लिए, आपको ये ज़रूरी शर्तें पूरी करनी होंगी:

  1. अपने Flutter ऐप्लिकेशन में Firebase जोड़ें.
  2. flutterfire CLI dart pub global activate flutterfire_cli इंस्टॉल करें.
  3. flutterfire configure चलाएं.

इसके बाद:

  1. अपने ऐप्लिकेशन का स्कीमा डेवलप करें.
  2. SDK टूल जनरेट करने की सुविधा सेट अप करें:

    • हमारे SQL Connect VS Code एक्सटेंशन में मौजूद, ऐप्लिकेशन में SDK टूल जोड़ें बटन की मदद से
    • अपडेट करके connector.yaml.
  3. अपने क्लाइंट कोड को शुरू करें और लाइब्रेरी इंपोर्ट करें.

  4. क्वेरी और म्यूटेशन के लिए कॉल लागू करें.

  5. सेट अप करें और SQL Connect एम्युलेटर का इस्तेमाल करें. साथ ही, इसे दोहराएं.

अपना Flutter SDK टूल जनरेट करें

अपने ऐप्लिकेशन में, SQL Connect से जनरेट किए गए SDK टूल सेट अप करने के लिए, Firebase का इस्तेमाल करें. init कमांड को मौजूदा फ़ोल्डर में मौजूद सभी ऐप्लिकेशन का पता लगाना चाहिए और जनरेट किए गए SDK टूल अपने-आप इंस्टॉल करने चाहिए.

firebase init dataconnect:sdk

प्रोटोटाइप बनाते समय, SDK टूल अपडेट करना

अगर आपने SQL Connect VS Code एक्सटेंशन इंस्टॉल किया है, तो यह जनरेट किए गए SDK टूल को हमेशा अप-टू-डेट रखेगा.

अगर SQL Connect VS Code एक्सटेंशन का इस्तेमाल नहीं किया जाता है, तो जनरेट किए गए SDK टूल को अप-टू-डेट रखने के लिए, Firebase CLI का इस्तेमाल किया जा सकता है.

firebase dataconnect:sdk:generate --watch

बिल्ड पाइपलाइन में SDK टूल जनरेट करना

CI/CD बिल्ड प्रोसेस में, SQL Connect SDK टूल जनरेट करने के लिए, Firebase CLI का इस्तेमाल किया जा सकता है.

firebase dataconnect:sdk:generate

क्लाइंट कोड सेट अप करना

अपना SQL Connect ऐप्लिकेशन शुरू करना

सबसे पहले, Firebase के सेटअप के लिए दिए गए सामान्य निर्देशों का पालन करके, अपना ऐप्लिकेशन शुरू करें.

इसके बाद, SQL Connect प्लगिन इंस्टॉल करें:

flutter pub add firebase_data_connect

SQL Connect Flutter SDK टूल शुरू करना

SQL Connect का इंस्टेंस शुरू करने के लिए, उस जानकारी का इस्तेमाल करें जिसका इस्तेमाल आपने SQL Connect सेट अप करने के लिए किया था. यह जानकारी Firebase कंसोल के SQL Connect टैब में उपलब्ध है.

लाइब्रेरी इंपोर्ट करना

अपने क्लाइंट कोड को शुरू करने के लिए, इंपोर्ट के दो सेट की ज़रूरत होती है. पहला, सामान्य SQL Connect इंपोर्ट और दूसरा, जनरेट किए गए SDK टूल के खास इंपोर्ट.

// general imports
import 'package:firebase_data_connect/firebase_data_connect.dart';

// generated queries and mutations from SDK
import 'generated/movies.dart';

क्लाइंट साइड पर क्वेरी का इस्तेमाल करना

जनरेट किए गए कोड में, पहले से तय किए गए क्वेरी रेफ़रंस मौजूद होंगे. आपको बस इन्हें इंपोर्ट करना होगा और इन पर execute को कॉल करना होगा.

import 'generated/movies.dart';

await MoviesConnector.instance.listMovies().execute();

एसडीके टूल के क्वेरी वाले तरीके कॉल करना

यहां इन ऐक्शन शॉर्टकट फ़ंक्शन का इस्तेमाल करने का एक उदाहरण दिया गया है:

import 'generated/movies.dart';

function onBtnClick() {
  // This will call the generated Dart from the CLI and then make an HTTP request to the server.
  MoviesConnector.instance.listMovies().execute().then(data => showInUI(data)); // == MoviesConnector.instance.listMovies().ref().execute();
}

वैकल्पिक फ़ील्ड

कुछ क्वेरी में वैकल्पिक फ़ील्ड हो सकते हैं. ऐसे मामलों में, Flutter SDK टूल एक बिल्डर तरीका दिखाता है. इसे अलग से सेट करना होगा.

उदाहरण के लिए, createMovie को कॉल करते समय, rating फ़ील्ड वैकल्पिक होता है. इसलिए, आपको इसे बिल्डर फ़ंक्शन में देना होगा.

await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi"}).rating(5).execute();

बदलावों की सदस्यता लेना

बदलावों की सदस्यता ली जा सकती है. इससे, क्वेरी को एक्ज़ीक्यूट करने पर, हर बार अपडेट मिलेगा.

QueryRef<ListMoviesData, void> listRef = MoviesConnector.instance.listMovies().ref();

// subscribe will immediately invoke the query if no execute was called on it previously.
listRef.subscribe().listen((data) {
  updateUIWithMovies(data.movies);
});

await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi" }).rating(5).execute();
await listRef.execute(); // will update the subscription above`

गिनती वाले फ़ील्ड में किए गए बदलावों को मैनेज करना

किसी ऐप्लिकेशन के स्कीमा में गिनती शामिल हो सकती है, जिन्हें आपकी GraphQL क्वेरी से ऐक्सेस किया जा सकता है.

ऐप्लिकेशन के डिज़ाइन में बदलाव होने पर, गिनती के लिए नई वैल्यू जोड़ी जा सकती हैं. उदाहरण के लिए, मान लें कि ऐप्लिकेशन के लाइफ़साइकल में बाद में, आपने AspectRatio गिनती में FULLSCREEN वैल्यू जोड़ने का फ़ैसला किया.

SQL Connect वर्कफ़्लो में, क्वेरी और SDK टूल अपडेट करने के लिए, लोकल डेवलपमेंट टूलिंग का इस्तेमाल किया जा सकता है.

हालांकि, क्लाइंट के अपडेट किए गए वर्शन को रिलीज़ करने से पहले, डिप्लॉय किए गए पुराने क्लाइंट काम करना बंद कर सकते हैं.

लचीले तरीके से लागू करने का उदाहरण

जनरेट किया गया SDK टूल, अज्ञात वैल्यू को मैनेज करने के लिए मजबूर करता है. इसका मतलब है कि क्लाइंट कोड को EnumValue ऑब्जेक्ट को Known या Unknown में अनरैप करना होगा.

final result = await MoviesConnector.instance.listMovies().execute();

if (result.data != null && result.data!.isNotEmpty) {
  handleEnumValue(result.data![0].aspectratio);
}

void handleEnumValue(EnumValue<AspectRatio> aspectValue) {
  if (aspectValue.value != null) {
    switch(aspectValue.value!) {
      case AspectRatio.ACADEMY:
        print("This movie is in Academy aspect");
        break;
      case AspectRatio.WIDESCREEN:
        print("This movie is in Widescreen aspect");
        break;
      case AspectRatio.ANAMORPHIC:
        print("This movie is in Anamorphic aspect");
        break;
      case AspectRatio.IMAX:
        print("This movie is in IMAX aspect");
    }
  } else {
    print("Unknown aspect ratio detected: ${aspectValue.stringValue}");
  }
}

क्लाइंट-साइड पर कैश मेमोरी में सेव करने की सुविधा चालू करना

SQL Connect में, क्लाइंट-साइड पर कैश मेमोरी में सेव करने की सुविधा मौजूद है. इसे connector.yaml फ़ाइल में बदलाव करके चालू किया जा सकता है. यह सुविधा चालू होने पर, जनरेट किए गए क्लाइंट SDK टूल, क्वेरी के जवाबों को स्थानीय तौर पर कैश मेमोरी में सेव करेंगे. इससे, आपके ऐप्लिकेशन के डेटाबेस के अनुरोधों की संख्या कम हो सकती है. साथ ही, नेटवर्क की उपलब्धता में रुकावट आने पर, आपके ऐप्लिकेशन के डेटाबेस पर निर्भर हिस्से काम कर सकते हैं.

क्लाइंट-साइड पर कैश मेमोरी में सेव करने की सुविधा चालू करने के लिए, अपने कनेक्टर कॉन्फ़िगरेशन में क्लाइंट कैश मेमोरी में सेव करने का कॉन्फ़िगरेशन जोड़ें:

generate:
  javascriptSdk:
    outputDir: ../dart/
    package: "dataconnect_generated"
    clientCache:
      maxAge: 5s
      storage: memory

इस कॉन्फ़िगरेशन में दो पैरामीटर होते हैं. दोनों वैकल्पिक हैं:

  • maxAge: कैश मेमोरी में सेव किए गए जवाब की ज़्यादा से ज़्यादा उम्र. इसके बाद, क्लाइंट SDK टूल नई वैल्यू फ़ेच करेगा. उदाहरण: "0", "30s", "1h30m".

    maxAge की डिफ़ॉल्ट वैल्यू 0 होती है. इसका मतलब है कि जवाब कैश मेमोरी में सेव किए जाते हैं, लेकिन क्लाइंट SDK टूल हमेशा नई वैल्यू फ़ेच करेगा. कैश मेमोरी में सेव की गई वैल्यू का इस्तेमाल सिर्फ़ तब किया जाएगा, जब execute() और subscribe() से मिले शुरुआती नतीजे के लिए, CACHE_ONLY तय किया गया हो.

  • storage: क्लाइंट SDK टूल को persistent स्टोरेज या memory में जवाब कैश मेमोरी में सेव करने के लिए कॉन्फ़िगर किया जा सकता है. persistent स्टोरेज में कैश मेमोरी में सेव किए गए नतीजे, ऐप्लिकेशन को रीस्टार्ट करने पर भी बने रहेंगे. Android या iOS को टारगेट करते समय, डिफ़ॉल्ट तौर पर persistent का इस्तेमाल किया जाता है. वेब ब्राउज़र को टारगेट करते समय, सिर्फ़ memory स्टोरेज इस्तेमाल किया जा सकता है.

कनेक्टर के कैश मेमोरी में सेव करने के कॉन्फ़िगरेशन को अपडेट करने के बाद, अपने क्लाइंट SDK टूल को फिर से जनरेट करें और अपने ऐप्लिकेशन को फिर से बनाएं. ऐसा करने के बाद, execute() और subscribe(), जवाबों को कैश मेमोरी में सेव करेंगे और आपके कॉन्फ़िगर की गई नीति के मुताबिक, कैश मेमोरी में सेव की गई वैल्यू का इस्तेमाल करेंगे. आम तौर पर, यह प्रोसेस अपने-आप होती है. इसके लिए, आपको कोई और कार्रवाई नहीं करनी पड़ती. हालांकि, इन बातों का ध्यान रखें:

  • execute() का डिफ़ॉल्ट व्यवहार ऊपर बताया गया है: अगर किसी क्वेरी के लिए कोई नतीजा कैश मेमोरी में सेव किया जाता है और कैश मेमोरी में सेव की गई वैल्यू, maxAge से पुरानी नहीं है, तो कैश मेमोरी में सेव की गई वैल्यू का इस्तेमाल करें. इस डिफ़ॉल्ट व्यवहार को PREFER_CACHE नीति कहा जाता है.

    execute() के अलग-अलग इनवोकेशन के लिए, यह भी तय किया जा सकता है कि सिर्फ़ कैश मेमोरी में सेव की गई वैल्यू (CACHE_ONLY) दिखाई जाएं या सर्वर से बिना शर्त नई वैल्यू (SERVER_ONLY) फ़ेच की जाएं.

    await queryRef.execute(fetchPolicy: QueryFetchPolicy.cacheOnly);
    
    await queryRef.execute(fetchPolicy: QueryFetchPolicy.serverOnly);
    
  • subscribe() को कॉल करने पर, अगर कैश मेमोरी में सेव किया गया कॉन्टेंट मौजूद है, तो यह maxAge सेटिंग के बावजूद, हमेशा तुरंत उसे दिखाएगा. execute() को बाद में कॉल करने पर, कॉन्फ़िगर किए गए maxAge के मुताबिक, लिसनर को सूचनाएं मिलेंगी.

क्लाइंट साइड पर म्यूटेशन का इस्तेमाल करना

म्यूटेशन को क्वेरी की तरह ही ऐक्सेस किया जा सकता है.

await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi" }).rating(5).execute();

अपने Flutter ऐप्लिकेशन का प्रोटोटाइप बनाना और उन्हें टेस्ट करना

स्थानीय एम्युलेटर का इस्तेमाल करने के लिए, क्लाइंट को इंस्ट्रूमेंट करना

आप SQL Connect एम्युलेटर का इस्तेमाल, SQL Connect VS Code एक्सटेंशन या CLI से कर सकते हैं.

दोनों ही स्थितियों में, ऐप्लिकेशन को एम्युलेटर से कनेक्ट करने के लिए इंस्ट्रूमेंट करने का तरीका एक ही है.

import 'package:firebase_data_connect/firebase_data_connect.dart';
import 'generated/movies.dart';

MoviesConnector.instance.dataConnect
          .useDataConnectEmulator('127.0.0.1', 9399);

// Make calls from your app
QueryRef<ListMoviesData, void> ref = MoviesConnector.instance.listMovies.ref();

प्रोडक्शन रिसॉर्स पर स्विच करने के लिए, एम्युलेटर से कनेक्ट करने वाली लाइनों को टिप्पणी के तौर पर मार्क करें.

Dart SDK में डेटा टाइप

SQL Connect सर्वर, GraphQL के सामान्य डेटा टाइप दिखाता है. इन्हें SDK टूल में इस तरह दिखाया जाता है.

SQL Connect टाइप Dart
टाइमस्टैम्प firebase_data_connect.Timestamp
इंट (32-बिट) int
तारीख DateTime
यूयूआईडी string
Int64 int
फ़्लोट double
बूलियन bool
कोई भी firebase_data_connect.AnyValue