Kompletny przewodnik po zarządzaniu stanem GetX we Flutterze — blog LogRocket (2023)

Co się stanie, gdy wciśniesz przycisk na centralce w swoim domu?

Zasadniczo zmieniasz stan przycisku z wyłączonego na włączony lub odwrotnie. To wyzwala elektryczność, która albo włącza żarówkę, albo ją wyłącza.

The ultimate guide to GetX state management in Flutter - LogRocket Blog (1)

Źródło:obrazy animowane.org

Myśl z punktu widzenia programisty. Gdy żarówka się włącza, interfejs żarówki zmienia się ze stanu niepodświetlonego na stan podświetlony. Chociaż fizycznie nie widzimy, aby żarówka była odtwarzana lub przebudowywana, interfejs użytkownika zostałby zbudowany od podstaw, gdyby taka była sytuacja w oprogramowaniu mobilnym z reaktywnym zarządzaniem stanem.

Jeśli pochodzisz z frameworka Android lub iOS, musisz zacząć myśleć o tworzeniu aplikacji mobilnych z zupełnie nowej perspektywy. Android i iOS to imperatywne frameworki. Z drugiej strony Flutter jest strukturą deklaratywną. Oznacza to, że można budować interfejs użytkownika od podstaw zamiast modyfikować niewielką jego część, ponieważ Flutter skutecznie odbudowuje interfejs użytkownika, gdy widżet zmienia swój stan.

Deklaratywny styl programowania interfejsu użytkownika ma swoje zalety; raz piszesz kod dowolnego UI i opisujesz, jak powinien wyglądać w dowolnym stanie, i to wszystko! Jednak gdy zagłębisz się w programowanie Fluttera, będą chwile, kiedy będziesz musiał udostępniać swoje dane i stan między ekranami w całej aplikacji. Wtedy będziesz potrzebować doskonałej biblioteki zarządzania stanem, która pomoże Ci szybko i wydajnie tworzyć aplikacje.

Zarządzanie stanem jest złożonym tematem dyskusji we Flutterze. Jednak wiele bibliotek zarządzania stanem, takich jakDostawca, są dostępne, co zaleca większość programistów.

Ale…

Dzisiaj omówimy uproszczone rozwiązanie do zarządzania stanem do tworzenia aplikacji Flutter, które nie wymaga kontekstu dla większości swoich funkcji, znane jako GetX.

  • Co to jest GetX?
  • Trzy filary GetX
  • Funkcje o wartości dodanej GetX
  • Zacznijmy od zarządzania stanem GetX
    • Alternatywna metoda
    • Proste zarządzanie stanem
  • Inne funkcje GetX

Co to jest GetX?

GetX to nie tylko biblioteka zarządzania stanem, ale mikroframework połączony z zarządzaniem trasami i wstrzykiwaniem zależności. Ma na celu zapewnienie najwyższej jakości środowiska programistycznego w wyjątkowo lekkim, ale potężnym rozwiązaniu dla Flutter. GetX ma trzy podstawowe zasady, na których jest zbudowany:

  1. Wydajność: skoncentrowana na minimalnym zużyciu pamięci i zasobów
  2. Produktywność: intuicyjne i wydajne narzędzie w połączeniu z prostotą i prostą składnią, które ostatecznie oszczędza czas programowania
  3. Organizacja: oddzielenie logiki biznesowej od logiki widoku i prezentacji nie może być lepsze niż to. Nie potrzebujesz kontekstu, aby nawigować między trasami, ani stanowych widżetów

Trzy filary GetX

  1. Zarządzanie stanem: GetX ma dwóch menedżerów stanu. Jednym z nich jest prosty menedżer stanu używany zGetBuilderfunkcja, a druga to reaktywny menedżer stanu używany zGetxLubDziękuję. Omówimy to szczegółowo poniżej
  2. Zarządzanie trasą: czy nawigacja między ekranami, wyświetlanieBary z przekąskami, wyskakujące okna dialogowe lub dodawanie dolnych arkuszy bez użyciakontekst, GetX Cię obejmuje. Nie będę pisać szczegółów na temat zarządzania trasami, ponieważ wykracza to poza zakres tego artykułu, ale rzeczywiście kilka przykładów, aby zorientować się, jak działa prostota składni GetX
  3. Zarządzanie zależnościami: GetX ma proste, ale wydajne rozwiązanie do zarządzania zależnościami za pomocą kontrolerów. Za pomocą tylko jednego wiersza kodu można uzyskać do niego dostęp z poziomu widoku bez użycia odziedziczonego widżetu lub kontekstu. Zazwyczaj tworzysz instancję klasy w klasie, ale w GetX tworzysz instancję za pomocąDostawaćinstancja, która będzie dostępna w całej aplikacji

Funkcje o wartości dodanej GetX

GetX ma kilka świetnych funkcji od razu po wyjęciu z pudełka, dzięki czemu tworzenie aplikacji mobilnych we Flutterze jest jeszcze łatwiejsze bez żadnego standardowego kodu:

  1. Internacjonalizacja: tłumaczenia z mapami klucz-wartość, obsługa różnych języków, używanie tłumaczeń z liczbą pojedynczą, mnogą i parametrami. Zmiana ustawień regionalnych aplikacji przy użyciu tylkoDostawaćsłowo w całej aplikacji
  2. Walidacja: walidacja adresu e-mail i hasła jest również objęta usługą GetX. Teraz nie musisz instalować osobnego pakietu weryfikacyjnego
  3. Przechowywanie: GetX zapewnia również szybkie i bardzo lekkie synchroniczne tworzenie kopii zapasowych pamięci klucz-wartość danych w całości zapisanych w Dart, które łatwo integruje się z podstawowym pakietem GetX
  4. Motywy: przełączanie między jasnymi i ciemnymi motywami jest proste dzięki GetX
  5. Responsywny widok: jeśli tworzysz aplikację dla różnych rozmiarów ekranu, po prostu musisz ją rozszerzyćGetView, i możesz szybko opracować swój interfejs, który będzie responsywny dla komputerów stacjonarnych, tabletów, telefonów i zegarków

Zacznijmy od zarządzania stanem GetX

Zrobię to krok po kroku, co zawsze lubię robić, i postaram się być opisowy i wyjaśnić proces tak szczegółowo, jak to możliwe.

Krok 1: Utwórz nową aplikację

Utwórz zupełnie nową aplikację w preferowanym środowisku IDE. Najpierw usuń wszystkie początkowe komentarze, wybierając opcję znajdź i zamień w plikuEdytowaćmenu i wpisz to:\/\/.*. Spowoduje to zaznaczenie komentarzy Fluttera w kodzie startowym i możesz po prostu nacisnąć przycisk usuwania.

Krok 2: Dodaj wymagane zależności

Dodaj te zależności w swoimpubspec.yamlplik:

get: ^4.6.1 //YAMLget_storage: ^2.0.3 //YAML

Uruchom to polecenie:

trzepoczący pub pobierz // YAML

Zanim przejdę do kroku 3, pozwól mi wyjaśnić, co tutaj robimy. Stworzyłem małą aplikację demonstrującą podstawowe funkcjonalności GetX. Aplikacja dotyczy sklepu, w którym użytkownik może:

  1. zmienić nazwę sklepu
  2. dodaj nazwy obserwujących
  3. dodaj liczbę obserwujących
  4. zmienić status sklepu z otwartego na zamknięty i odwrotnie
  5. dodaj recenzje do sklepu
  6. zmień motyw sklepu z jasnego na ciemny

Wszystko powyższe wyjaśnizarządzanie państwem, zarządzanie zależnościami, zarządzanie trasami, przechowywanie i motywy.

Tutaj bardziej koncentrujemy się na zarządzaniu stanem i zależnościami. Trasa, pamięć i motywy służą wyłącznie estetyce aplikacji.

Możesz czytać razem iprzetestuj aplikację za pomocą tego linku.

Krok 3: Zaktualizuj plikAplikacja materiałowaWidżet

Po dodaniu zależności pierwszą rzeczą, którą musisz zrobić, to zmienić plikAplikacja materiałowawidżet doGetMaterialAppw Twoimrzutka głównaplik. Daje to dostęp do wszystkich właściwości GetX w całej aplikacji.

Ponad 200 000 programistów używa LogRocket do tworzenia lepszych doświadczeń cyfrowych. Dowiedz się więcej →

Krok 4: Dodaj kontroler GetX

Ustaliliśmy już, że GetX oddziela interfejs użytkownika od logiki biznesowej. Tutaj do gry wkracza GetX Controller.

Zawsze możesz utworzyć więcej niż jeden kontroler w swojej aplikacji. Klasa kontrolera GetX kontroluje stan interfejsu użytkownika, gdy dołączasz do niego pojedynczy widżetObserwatortak, że odbudowuje się tylko wtedy, gdy następuje zmiana stanu tego konkretnego widżetu.

Dodajemy nowy plik Dart, aby utworzyć naszą klasę kontrolera,StoreController, która rozciąga sięGetxController:

klasa StoreController rozszerza GetxController {}

Następnie dodajemy kilka zmiennych i inicjalizujemy je wartościami domyślnymi.

Zwykle dodalibyśmy te zmienne w następujący sposób:

final storeName = 'Gęsty potrząśnięcie';

Ale kiedy używamy GetX, musimy sprawić, by zmienne były obserwowalne przez dodanieobsna końcu wartości. Następnie, gdy zmienna ulegnie zmianie, inne części aplikacji, które są od niej zależne, zostaną o tym powiadomione. Więc teraz nasza zainicjowana wartość będzie wyglądać tak:

final storeName = 'Gruby potrząśnięcie'.obs;

Pozostałe zmienne są podane poniżej:

// Ciąg do zmiany nazwy sklepu final storeName = 'Thick Shake'.obs;// int do zwiększenia liczby obserwujących final followerCount = 0.obs;// bool do wyświetlenia statusu sklepu open lub closefinal storeStatus = true.obs; // Lista nazw obserwujących sklep final followerList = [].obs;// Mapa nazw i ich recenzji dla Storefinal review = [].obs;// kontrolery edycji tekstu final storeNameEditingController = TextEditingController();final reviewEditingController = TextEditingController();final followerController = TextEditingController();final reviewNameController = TextEditingController();

Następnie tworzymy trzy metody zmiany nazwy, zwiększenia liczby obserwujących oraz zmiany statusu sklepu:

updateStoreName(Nazwa Ciągu) { storeName(name);}updateFollowerCount() { followerCount(followerCount.value + 1);} unieważnić storeStatus(bool isOpen) { storeStatus(is Open);}

Krok 5: Wstrzyknięcie zależności

W kategoriach laika dodajemykontrolerclass, którą właśnie utworzyliśmy, do naszegopoglądklasa. Istnieją trzy sposoby tworzenia instancji.

  1. Rozciągnięcie całościpoglądklasa zGetViewi wstrzykując naszeStoreControllerz tym:
    klasa Home rozszerza GetView{}
  2. Tworzenie instancjisklepKontrolerlubię to:
    final storeController = Get.put(StoreContoller())
  3. W przypadku opcji trzeciej zacznij od utworzenia nowegoStoreBindingklasa i implementacjaWiązania. Wewnątrz jego domyślnych zależności musiszleniwyPuttheStoreControllerużywającGet.lazyPut(). Po drugie, musisz dodać klasę wiążącą wewnątrz plikupoczątkowe wiązanienieruchomość wGetMaterialWidget.

W końcu zamiastGet.Putjak wspomniano powyżej, teraz możesz użyćPobierz.znajdźa GetX znajdzie dla ciebie kontroler, gdy utworzysz instancję w dowolnej ze swoich klas:

klasa StoreBinding implementuje powiązania {// domyślna zależność @override void dependencies() { Get.lazyPut(() => StoreController(); }}
@overrideWidget build (kontekst BuildContext) { return GetMaterialApp (debugShowCheckedModeBanner: false, tytuł: „GetX Store”, initialBinding: StoreBinding (),}
class UpdateStoreName extends StatelessWidget { UpdateStoreName({Key? key}): super(key: key);//Getx znajdzie twój kontroler. final storeController = Get.find();

W projekcie jest dużo kodu i plików Dart. Piszę tylko o trzech metodach, które wymieniłem powyżej. Reszta kodu będzie dostępna na Git. Link zostanie podany na końcu tego artykułu. Po drugie, ty też możeszwypróbuj aplikację za pośrednictwem łącza internetowego.

Krok 6: Utwórz instancję kontrolera

Ponieważ rozszerzyliśmy nasząDomzobacz zGetViewi utworzył klasę wiążącą doleniwyPutnasz kontroler w nim, którego teraz użyjemyPobierz.znajdźaby utworzyć instancję naszego kontrolera w naszych klasach.

Najpierw dodajemy nowy bezstanowy widżet,Aktualizuj nazwę magazynu. Utwórz instancję naszegokontrolertaka klasa:

final storeController = Get.find();
RoundedInput(hintText: "Store Name", kontroler: storeController.storeNameEditingController,),const SizedBox(height: 20),ElevatedButton( onPressed: () { storeController.updateStoreName( storeController.storeNameEditingController.text); Get.snackbar( 'Zaktualizowany' , 'Nazwa sklepu została zaktualizowana na ''${storeController.storeNameEditingController.text}', snackPosition: SnackPosition.BOTTOM); }, child: const Padding( dopełnienie: EdgeInsets.all(10.0), child: Text('Update' , styl: TextStyle(rozmiar czcionki: 20,0), ), ),

Pozwól, że wyjaśnię powyższy kod:Zaokrąglone wejściejest po prostu zwyczajemPole tekstowe, i dodajemy aTextEditingControllerdlaPole tekstoweza pomocą naszegosklepKontroler. Dzwonimy również doaktualizacjaStoreName()metoda w ten sam sposób wewnątrz plikuwciśniętyzPrzycisk Podwyższony. A potem pokazujemy aBatonikjako potwierdzenie, że nazwa sklepu została zaktualizowana.

Poniżej kod doDodaj liczbę obserwującychIStan magazynu. Ponownie oba są bezstanowymi widżetami, a metoda implementacjisklepKontrolera wywołanie naszego kontrolera jest podobne:

class AddFollowerCount extends StatelessWidget { AddFollowerCount({Klucz? klucz}): super(klucz: klucz); final storeController = Get.find(); @override Widget build(BuildContextcontext) { return Scaffold( appBar: AppBar(title: const Text("Dodaj liczbę obserwujących")), floatActionButton: FloatingActionButton( onPressed: () {storeController.updateFollowerCount(); }, child: const Icon (Icons.add), ), body: Container( padding: const EdgeInsets.all(24), child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text („Dodałeś tylu obserwujących do Twój sklep”, textAlign: TextAlign.center, style: TextStyle(fontSize: 28), ), const SizedBox( height: 40.0, ), Obx( () => Text( storeController.followerCount.value.toString(), style: const TextStyle(rozmiar czcionki: 48), ), ) ], ), ), ); }}
klasa StoreStatus extends StatelessWidget { StoreStatus({Klucz? klucz}): super(klucz: klucz); //final storeController = Get.put(StoreController()); final storeController = Get.find(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("Test Status Toggle")), body: Container( padding: const EdgeInsets.all(24), child: Center( child: Column ( mainAxisAlignment: MainAxisAlignment.center, dzieci: [ const Text("Czy sklep jest otwarty?", style: TextStyle(fontSize: 22), ), const SizedBox(height: 16), Obx( () => Switch( onChanged: (wartość) => storeController.storeStatus(value), activeColor: Colors.green, value: storeController.storeStatus.value, ), ) ], ), ), ), ); }}

Krok 7:DziękujęWidżet (obserwator)

Przejdźmy teraz do części, w której wprowadzona wartość nazwy naszego sklepu, zwiększona liczba obserwujących i status sklepu zostaną pokazane za pomocą naszegosklepKontroler.

NaszDomwidok jest rozszerzony oGetView, więc nie musimy tworzyć instancji naszegosklepKontrolerTutaj. Zamiast tego możemy po prostu użyć domyślnego kontrolera GetX. Proszę spojrzeć na kod podany poniżej, aby uzyskać jasny obraz i zrozumieć różnicę między krokiem 6 a krokiem 7.

Więcej świetnych artykułów z LogRocket:

  • Nie przegap chwili zPowtórka, wyselekcjonowany biuletyn firmy LogRocket
  • Uczyć sięjak Galileo firmy LogRocket przebija się przez szum, aby proaktywnie rozwiązywać problemy w Twojej aplikacji
  • Użyj useEffect Reactaw celu optymalizacji wydajności aplikacji
  • Przełączać się międzywiele wersji Node
  • Dowiedz się, jak animowaćTwoja aplikacja React z AnimXYZ
  • Poznaj Taurusa, nowy framework do tworzenia plików binarnych
  • PorównywaćNestJS kontra Express.js

Pewnie zauważyłeś, że tzwTekstwidżet wewnątrzElastycznywidżet jest opakowany w plikDziękujęwidżet, w którym nazwaliśmy również naszkontroler. Pamiętaj, jak dodaliśmy(.obs)do naszych zmiennych? Teraz, gdy chcemy zobaczyć zmianę tej obserwowalnej zmiennej, musimy otoczyć widżetDziękuję, znany również jakoObserwator, podobnie do tego, co musiałeś zauważyć w powyższym kodzie.

Zawijanie widżetu za pomocąDziękujęodbuduje tylko ten konkretny widżet, a nie całą klasę, gdy zmieni się stan. Oto jakie to proste:

class Home extends GetView { Home({Klucz? klucz}): super(klucz: klucz); @override Kompilacja widżetu (kontekst kompilacji) { return Scaffold( backgroundColor: AppColors.spaceCadet, appBar: AppBar(title: const Text("GetX Store")), szuflada: const SideDrawer(), body: Container(wypełnienie: const EdgeInsets .all(10), child: SingleChildScrollView( child: Column( children: [ MainCard( title: "Store Info", body: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const Flexible( child: Text('Store Name:', style: TextStyle(fontSize: 20),), fit: FlexFit.tight,), const SizedBox(width: 20.0), // Wrapped with Obx, aby obserwować zmiany w storeName // zmienna wywołana przy użyciu StoreController.Obx( () => Flexible( child: Text( controller.storeName.value.toString(), style: const TextStyle( fontSize: 22, fontWeight: FontWeight.bold) ), fit : FlexFit.tight, ),), ],), const SizedBox(height: 20.0), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const Flexible( child: Text('Store Followers:', style: TextStyle(fontSize : 20),), fit: FlexFit.tight, ), const SizedBox(width: 20.0), // Wrapped with Ox, aby obserwować zmiany w zmiennej followerCount // po wywołaniu za pomocą StoreController. Obx( () => Flexible( child: Text( controller.followerCount.value.toString(), textAlign: TextAlign.start, style: const TextStyle( fontSize: 22, fontWeight: FontWeight.bold), ), fit: FlexFit. ciasno,),),], ), const SizedBox(height: 20.0), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const Flexible( child: Text('Status:', style: TextStyle(fontSize: 20), ), fit: FlexFit.tight,), const SizedBox(width: 20.0), // Wrapped with Ox, aby obserwować zmiany w storeStatus // zmiennej wywołanej przy użyciu StoreController. Obx( () => Flexible( child: Text( controller.storeStatus.value ? 'Open': 'Closed', textAlign: TextAlign.start, style: TextStyle( color: controller.storeStatus.value? Colors.green.shade700: Colors.red, fontSize: 22, fontWeight: FontWeight. pogrubiony),), dopasowanie: FlexFit.tight, ), ), ], ), ], ), ),

Celowo zaznaczyłem tzwkontroleryIDziękujęzrozumieć różnicę między domyślnym widżetem stanowym dostarczanym przez Flutter a wykorzystaniem GetX do zarządzania stanem widoku lub całej aplikacji.

Gdybyśmy używali stanowego widżetu, musielibyśmy użyćsetState()metodę za każdym razem, gdy chcieliśmy zobaczyć zmiany. Musielibyśmy się też pozbyćkontroleryręcznie. Zamiast tego unikamy całego kodu standardowego i po prostu opakowujemy nasz widżetDziękuję, a reszta załatwiona.

Gdybyśmy mieli podsumować wszystkie powyższe, można by to zrobić tylko w dwóch krokach:

  1. Dodaćobsdo Twojej zmiennej
  2. Owiń swój widżet za pomocąDziękuję

Alternatywna metoda

Cóż, nie jest to jedyny sposób, aby to zrobić. Na przykład, jeśli sprawisz, że zmienne będą obserwowalne, możesz również opakować widżetGetXbezpośrednio zamiastDziękuję. Jednak funkcjonalność pozostaje taka sama. W ten sposób nie trzeba tworzyć instancjisklepKontrolerzanim będzie można go wywołać. Proszę spojrzeć na poniższy kod:

// Opakowane z GetX w celu obserwowania zmian w zmiennej//storeStatus po wywołaniu przy użyciu StoreController.GetX( builder: (sController) => Flexible( child: Text( sController.storeStatus.value ? 'Open' : 'Closed', textAlign: TextAlign.start, style: TextStyle( color: sController.storeStatus.value ? Colors.green.shade700 : Colors.red, fontSize: 22, fontWeight: FontWeight.bold), ), fit: FlexFit. obcisły, ),),

N.B., zmieniłemstan magazynuzDziękujęDoGetXi korzystaKontrolerodbudynekfunkcjonować.

Zawijanie widżetów za pomocąDziękujęLubGetXjest znane jako reaktywne zarządzanie stanem.

Proste zarządzanie stanem

Zobaczmy przykład prostego zarządzania stanem. Po pierwsze, zaletą korzystania z prostego zarządzania stanem jest to, że nie trzeba zmieniać swojegoWidżet materiałuDoGetMaterialWidget. Po drugie, możesz łączyć inne biblioteki zarządzania stanem z prostym zarządzaniem stanem.

N.B., jeśli nie zmienisz swojegoWidżet materiału DoGetMaterialWidget, nie będziesz mógł korzystać z innych funkcji GetX, takich jak zarządzanie trasami.

Dla prostego zarządzania stanem:

  1. musisz użyć tzwGetBuilderfunkcjonować
  2. nie potrzebujeszzauważalnyzmienne
  3. musisz zadzwonić doaktualizacja()funkcja w twojej metodzie

Stworzyłem nową zmienną w naszymStoreController. Ale tym razem nie dodałem(obs)na końcu zmiennej. Oznacza to, że teraz nie jest obserwowalny.

Ale nadal potrzebuję, aby mój widok był aktualizowany, gdy liczba sklepów wzrośnie, więc muszę zadzwonićaktualizacja()function wewnątrz mojej nowo utworzonej metody. Sprawdź poniższy kod:

// zmienna nie jest obserwowalnaint storeFollowerCount = 0;void incrementStoreFollowers() { storeFollowerCount++;//funkcja aktualizacji wymaga wywołania update();}

Teraz w naszymDomzobacz, że się zmieniłemDziękujęDoGetBuilderdoTekstwidżet, który wyświetla liczbę obserwujących:

GetBuilder( builder: (newController) => Flexible( child: Text( newController.storeFollowerCount.toString(), textAlign: TextAlign.start, style: const TextStyle( fontSize: 22, fontWeight: FontWeight.bold), ), krój: FlexFit.tight, ),),

Ponieważ zawijamy naszą liczbę obserwującychGetBuilderw naszymDomwidok, musimy również wprowadzić zmiany wDodaj liczbę obserwującychPlik darta.

  1. Dodaj to wewnątrzwciśniętyfunkcja wfajprzycisk:
    storeController.incrementStoreFollowers();
    1. ZawińTekstwidżet zGetBuilderjak również, aby wyświetlał liczbę obserwujących:
      GetBuilder( builder: (newController) => Text( 'Z GetBuilder: ${newController.storeFollowerCount.toString()}', textAlign: TextAlign.start, style: const TextStyle( fontSize: 22, fontWeight: FontWeight.bold ), ),),

Jest jeszcze jedna różnica między używaniemDziękujęLubGetXi za pomocąGetBuilder. Podczas używaniaDziękujęLubGetX, musisz dodać wartość po wywołaniu metody przy użyciu metodyStoreController. Ale podczas używaniaGetBuilder, nie trzeba dodawać do niego parametru wartości. Proszę spojrzeć na różnicę poniżej:

// parametr wartości do dodania za pomocą Obx lub GetXcontroller.storeName.value.toString(),// parametr wartości nie jest potrzebny za pomocą GetBuildernewController.storeFollowerCount.toString(),

To wszystko, jeśli chodzi o zarządzanie różnymi stanami zapewniane przez GetX. Ponadto, zgodnie z obietnicą, piszę trochę o zarządzaniu trasami i innych funkcjach pakietu GetX. Dlatego potrzebny jest cały nowy artykuł, aby szczegółowo o tym wszystkim napisać.

Inne funkcje GetX

Zarządzanie trasami

Tradycyjnie, gdy użytkownik chce przejść z jednego ekranu do drugiego za pomocą kliknięcia przycisku, kod wyglądałby tak:

Navigator.push(context, MaterialPageRoute(konstruktor: (context)=> Home()));

Ale w GetX są dosłownie tylko dwa słowa:

Dostać się do domu());

Gdy chcesz wrócić do poprzedniego ekranu:

Navigator.pop(kontekst);

Nie ma absolutnie potrzeby kontekstu, gdy używasz GetX:

Cofnąć się();

Jeśli masz otwarte okno dialogowe lub szufladę i chcesz przejść do innego ekranu podczas zamykania szuflady lub okna dialogowego, możesz to zrobić na dwa sposoby z domyślną nawigacją Flutter:

  1. Zamknij szufladę lub okno dialogowe, a następnie nawiguj w następujący sposób:
    Navigator.pop(kontekst);Navigator.push(kontekst, MaterialPageRoute(konstruktor: (kontekst)=> SecondScreen()));
  2. Jeśli masz wygenerowane nazwane trasy:
    Navigator.popAndPushNamed(kontekst, '/sekunda');

Dzięki GetX znacznie łatwiej jest generować nazwane trasy i nawigować między ekranami podczas zamykania otwartych okien dialogowych lub szuflad:

// dla nazwanych trasGet.toNamed('/second'),// aby zamknąć, a następnie przejdź do nazwanej trasyGet.offAndToNamed('/second'),

Funkcje o wartości dodanej

  1. Bary z przekąskami
    Get.snackbar( 'title', 'message', snackPosition: SnackPosition.BOTTOM,colorText: Colors.white,backgroundColor: Colors.black,borderColor: Colors.white);
  2. Dialogi
    Get.defaultDialog( radius: 10.0, contentPadding: const EdgeInsets.all(20.0), title: 'title', middleText: 'content', textConfirm: 'Ok', potwierdź: OutlinedButton.icon( onPressed: () => Get. back(), ikona: const Icon( Icons.check, color: Colors.blue, ), label: const Text('Okay', style: TextStyle(color: Colors.blue), ), ), anuluj: OutlinedButton.icon ( onPressed: (){}, ikona: Icon(), label: Text(),),);
  3. Arkusze dolne
    Get.bottomSheet( Container( height: 150, color: AppColors.spaceBlue, child: Center( child: Text( 'Licznik osiągnął ${obxCount.value.toString()}'), style: const TextStyle(fontSize: 28.0, color : Kolory.biały), )),));

Patrząc na powyższy kod, możesz łatwo zrozumieć, jak łatwo jest wyświetlać i dostosowywać paski przekąsek, okna dialogowe i dolne arkusze.

Cóż, to wierzchołek góry lodowej. Z biblioteką GetX można zrobić o wiele więcej. Zanim zakończę mój artykuł, ostatni przykład to przełączanie między jasnymi i ciemnymi motywami.

Przełączanie z jasnych na ciemne motywy i odwrotnie

Najpierw stworzyłem tzwKontroler motywupodobny do naszegoStoreController. Wewnątrz mojego kontrolera używamGetStoragefunkcja zapisywania zmienionego motywu:

klasa ThemeController rozszerza GetxController { final _box = GetStorage(); final _key = 'jestDarkMode'; ThemeMode pobierz motyw => _loadTheme() ? ThemeMode.dark : ThemeMode.light; bool _loadTheme() => _box.read(_key) ?? FAŁSZ; void saveTheme(bool isDarkMode) => _box.write(_key, isDarkMode); void changeTheme(motyw ThemeData) => Get.changeTheme(motyw); void changeThemeMode(ThemeMode themeMode) => Get.changeThemeMode(themeMode);}

W środkuGetMaterialAppwidżet, dla którego dodałem właściwościtematIciemny schematjak również zainicjowanyKontroler motywui dodał to samo doTryb motywunieruchomość:

klasa MojaAplikacja rozszerza StatelessWidget { MojaAplikacja({Klucz? klucz}): super(klucz: klucz); final themeController = Get.put(ThemeController()); @override Widget build (kontekst BuildContext) { return GetMaterialApp (debugShowCheckedModeBanner: false, title: „GetX Store”, initialBinding: StoreBinding(), motyw: Themes.lightTheme, darkTheme: Themes.darkTheme, themeMode: themeController.theme,}}

Dalej w naszymDomekran wpasek aplikacji, dodałem ikonę, która przełącza motyw między jasnym a ciemnym. Wystarczy spojrzeć na poniższy kod:

class Home extends GetView { Home({Klucz? klucz}): super(klucz: klucz); final themeController = Get.find(); @override Widget build(BuildContext context) { return Scaffold(backgroundColor: AppColors.spaceCadet, appBar: AppBar(title: const Text("GetX Store"), akcje: [IconButton( onPressed: () { if (Get.isDarkMode) { themeController.changeTheme(Themes.lightTheme); themeController.saveTheme(false); } else {themeController.changeTheme(Themes.darkTheme); themeController.saveTheme(true); }}, ikona: Get.isDarkMode ? const Icon(Icons.light_mode_outlined ) : const Icon(Icons.dark_mode_outlined),),], ),

I to wszystko. Teraz możesz łatwo przełączać się między jasnymi i ciemnymi motywami.

Wniosek

Czy po przeczytaniu całego artykułu zastanawiasz się, dlaczego twórca tej biblioteki nadał jej nazwę GetX? Moim skromnym zdaniem ludzie często wydają rozkaz mówiąc: „Do dzieła!” lub „Zróbmy to!”

Jednak x jest nieznaną zmienną, ale w tym przypadku jest to naprawdę wszystko.

Możesz załatwić wszystko z GetX.

To wszystko na teraz i dziękuję za przeczytanie. Jeśli masz jakieś sugestie, poprawki lub opinie, zostaw komentarz poniżej.

Zostawiam poniżej linki do kodu źródłowego aplikacji, którą wyjaśniłem w tym artykule oraz dodatkową kontr-aplikację dla podstaw. Możesz sklonować repozytorium Git i samemu poeksperymentować z kodem. Istnieją również łącza do PWA do wypróbowania aplikacji bez żadnych instalacji.

Linki do kodu źródłowego na GitHub

Link do sklepu GetX:https://github.com/timelessfusionapps/getx_store

Link licznika GetX:https://github.com/timelessfusionapps/getx_counter

Łącza do aplikacji internetowej

Link do sklepu GetX:https://getx-store.web.app/#/

Aplikacja licznika GetX:https://getx-counter.web.app/#/

Pozbądź się zgiełku tradycyjnego raportowania błędów za pomocąLogRocket

LogRocketto cyfrowe rozwiązanie do analizy doświadczeń, które chroni Cię przed setkami fałszywie dodatnich alertów o błędach do zaledwie kilku naprawdę ważnych elementów. LogRocket informuje o najbardziej znaczących błędach i problemach z interfejsem użytkownika, które faktycznie wpływają na użytkowników w Twoich aplikacjach.

Następnie użyj powtórki sesji z głęboką telemetrią techniczną, aby dokładnie zobaczyć, co zobaczył użytkownik i co spowodowało problem, tak jakbyś patrzył mu przez ramię.

LogRocket automatycznie agreguje błędy po stronie klienta, wyjątki JS, wskaźniki wydajności frontendu i interakcje użytkownika. Następnie LogRocket wykorzystuje uczenie maszynowe, aby powiedzieć Ci, które problemy dotykają najwięcej użytkowników i zapewnia kontekst potrzebny do ich rozwiązania.

Skoncentruj się na błędach, które mają znaczenie —wypróbuj LogRocket już dziś.

FAQs

How do you refresh a GetX controller in Flutter? ›

Flutter, how to refresh my controller and request with getx
  1. jokeController. joke. refresh();
  2. setState ((){});
  3. Get.to(JokePage());
Nov 9, 2021

Is Riverpod better than GetX? ›

Is Riverpod better than GetX? GetX is more of a framework for Flutter than just a state management tool. GetX is better for small applications, and Riverpod is better for large products. The additional functions and utilities are unnecessary if one needs a state manager.

What is the use of GetX in Flutter? ›

GetX is an extra-light and powerful solution for Flutter. It combines high-performance state management, intelligent dependency injection, and route management quickly and practically.

What is the difference between GetX and OBX? ›

You can use GetX when you want to observe state changes and automatically update the widgets that depend on them. GetX performs better as it only updates the necessary widgets. Obx: Obx stands for "Observer Widget". You can use Obx when you want to update all the widgets associated with the observed state.

What is GetX service? ›

What is GetxService? GetxService is a feature in the GetX package for Flutter that helps you manage services and dependencies in your app. It allows you to create a service once and use it throughout your app, which makes your code more efficient and easier to maintain.

How do I reset my Flutter settings? ›

Quick Clean Cache
  1. Open android studio Tools->Flutter->Clean.
  2. Go to File -> Invalidate Caches / Restart.
  3. Or open terminal run "flutter clean"
  4. Remove pubspec.lock.

Is GetX recommended? ›

GetX is a great project but it should be used carefully with good practices because it still needs to improve to use all their features without risks. If you need unit and widget testing think twice before use GetX.

Which is the best GetX or provider Flutter? ›

Conclusion. In conclusion, both GetX and Bloc are excellent state management solutions for Flutter app development. If you are developing a small, medium and large application and want a simple and fast solution also for a large scale application, GetX is a good choice.

What is Riverpod used for? ›

Riverpod is a reactive caching framework for Flutter/Dart. It can automatically fetch, cache, combine and recompute network requests, while also taking care of errors for you. It is a reconstruction of the Provider package; meaning it reduces dependencies.

What is the benefit of Flutter app? ›

Benefits of Flutter App Development
  • Flutter is a Cross-platform Development Framework. ...
  • Same UI and Business Logic in All Platforms. ...
  • Fast Development due to “Hot Reload” feature. ...
  • Highly Customizable UI Design. ...
  • A Wide Variety of Rich Widgets. ...
  • Access to Native Features. ...
  • Publicly Accessible.
Mar 13, 2023

Why do people use Flutter? ›

Flutter is used for building cross-platform applications. Since it operates within a single codebase and renders into native code on each platform, Flutter engineers can create native-like applications faster and with lower development costs. Flutter apps comply with iOS, Android, Windows, MacOS and other platforms.

What is flutter flow used for? ›

FlutterFlow is an online browser-based app builder that enables users to create native cross-platform applications. This is a third-party visual app builder for the Flutter framework, enabling app builders to accelerate the process significantly.

Why are Outer Banks houses so cheap? ›

You also can't buy and tear down and rebuild, the lots are too small to allow rebuilding, so they are there as long as they are there and then gone forever. This makes the price less attractive and lower. Many take the risk because they could be there another 5-10 years and they rent GREAT, 9-10% is not uncommon.

How realistic is OBX? ›

Is the Outer Banks a real place? Believe it or not, the OBX is 100 percent real. It's a group of islands located right off of North Carolina that are a pretty popular destination for surfing and beach-going.

Which part of Outer Banks is the best? ›

The Best Places to Live in the Outer Banks
  • Corolla. The most northern town in the Outer Banks, Corolla is home to miles of beautiful beaches, wild horses, fabulous restaurants, a plethora of outdoor activities, and great golfing. ...
  • Duck. ...
  • Southern Shores. ...
  • Kitty Hawk. ...
  • Kill Devil Hills. ...
  • Nags Head. ...
  • Manteo. ...
  • Rodanthe.

What is Flutter repo? ›

The repository pattern is a software design pattern that decouples the data access logic from the business logic by introducing a centralized component called a repository.

What is state management with provider package Flutter? ›

The “state” in Flutter refers to the data stored inside a widget that can be modified depending on the current operation. The state of an app can be updated or completely changed at the start of an application, or when a page reloads.

What is the package manager for Flutter? ›

Pub is Dart's package manager. It's where you pull in open-source libraries, as well as your own. Most packages you'll ever use are at pub.dartlang.org/. Here you'll find packages published by the Flutter and Dart teams, as well as Dart community members.

How do I reset my Android Studio UI? ›

To return to the default layout of the current tool window, click Window > Restore Default Layout. To customize your default layout, click Window > Store Current Layout as Default. To show or hide the entire tool window bar, click the window icon in the bottom left-hand corner of the Android Studio window.

How to deactivate or override the android back button in Flutter? ›

To disable back button in Flutter, you can use the WillPopScope widget. The WillPopScope widget helps you get a callback whenever the back button is pressed. Inside the callback, if you return true the screen will be popped and if you return false, you have simply disabled the back button.

How do I get rid of DEBUG message Flutter? ›

The debugShowCheckedModeBanner property should be set to false when you want to remove the DEBUG banner in your Flutter application. This is particularly important when you're deploying your application for production or publishing it on app stores.

What is dependency injection in Flutter? ›

Dependency Injection (DI) is a design pattern used to implement Inversion of Control. It allows the creation of dependent objects outside of a class and provides those objects to a class through different ways.

What is controller in Flutter? ›

In flutter, controllers are a means to give control to the parent widget over its child state. The main selling point of controllers is that they remove the need of a GlobalKey to access the widget State. This, in turn, makes it harder to do anti-pattern stuff and increase performances.

Is it a good idea to use Flutter? ›

Flutter is ideal for developing an MVP when you have a small budget and an impending deadline. The framework has a flexible and user-friendly UI that makes designing easy and fast. As such, developers can use Flutter to test app ideas without requiring a huge investment of money or time.

What is the most used backend with Flutter? ›

Your Flutter web apps can be hosted using Golang's static server. The creation of the server is fast and simple since it requires just a few lines of code. As a result, you get all the benefits of Golang backend not only for mobile, but for web apps as well.

What is difference between Getx and provider Flutter? ›

As far as I can see, provider has more boilerplate, but it fits really nicely with Flutter, allowing Consumer to rebuild parts of the Widget tree, once an injected value change. get_it on the other hand is more straightforward, easier to use, and not dependant on Flutter, so can be used with any Dart code.

Why Riverpod is better than Bloc? ›

One of the key benefits of Riverpod is its ability to manage complex state structures in a clean and organized way. Riverpod provides a way to organize state into “providers”, which can be nested within each other to represent complex relationships between different pieces of state.

What is Redux Flutter? ›

Redux is a state management architecture library that successfully distributes data across widgets in a repetitive manner. It manages the state of an application through a unidirectional flow of data. Let's explore the diagram below: In this example, data generated in the main widget is needed in sub-widget 8.

How do I use Flutter database? ›

Example
  1. Create a new Flutter project.
  2. Add the sqflite and path packages to your pubspec.yaml .
  3. Paste the following code into a new file called lib/db_test.dart .
  4. Run the code with flutter run lib/db_test.dart .

Can I make money with Flutter? ›

Building Flutter apps for clients: You can also build Flutter apps for clients and earn money. You can find clients by networking or by using platforms like Upwork and Freelancer. Creating Flutter courses: Creating Flutter courses is a great way to earn money.

Does Flutter cost money? ›

Tools and Flutter license pricing

The framework is absolutely free, even for commercial use. But you may need some other tools for which you might need to pay. Below you'll find a list of some tools you may need. An integrated development environment (IDE) — special software for building applications.

What is the benefit of Flutter web? ›

Benefits of Flutter Web Development
  • Better team management. The biggest benefit of Flutter web development is sharing the code between mobile, web, and desktop apps. ...
  • Greater in-house development capabilities. ...
  • A large number of popular Flutter libraries available. ...
  • Extensive customization options. ...
  • Enabling accessibility focus.
Dec 2, 2022

Does Google use Flutter? ›

Flutter is Google's UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.

Why people don't use Flutter? ›

Just like we've already mentioned, apps built with Flutter take more space than they would if written natively since it inserts its own engine into the code. In the case of a web app, that means longer loading times and slower performance (compared to the competitors), which is bad for SEO.

What is firebase used for? ›

The Firebase Realtime Database is a cloud-hosted NoSQL database that lets organizations store and sync data in real time across all of their users' devices. This makes it easy to build apps that are always up to date, even when users are offline.

Who needs Flutter? ›

Flutter is the most sought-after skill among developers and engineers because it is easy and popular to learn, with fast-growing communities, and incredibly beneficial to implement in large-scale businesses.

What are the native apps? ›

The term native app suggests an app you can download and install on your device. A native mobile app is developed specifically for a mobile device. The terms native app, native mobile app, and mobile app are often used interchangeably to refer to the same type of software.

Do any celebrities live in Outer Banks? ›

Tim Reynolds of Dave Matthews Band fame has a house in the Outer Banks and occasionally can be found playing casual gigs at local bars. Other rocker sightings include Dave Grohl of Foo Fighters, Robert Plant of Led Zeppelin, and Keith Richards of the Rolling Stones.

What is the quietest town in Outer Banks? ›

Laid Back Like the Outer Banks of Old

Salvo, NC, is the quietest of the three villages of Rodanthe/Waves/Salvo, known locally as the Tri-Villages. Salvo is predominantly residential and perfect for a quiet vacation.

What is the most expensive place on OBX? ›

$11M Corolla estate called 'A Welcome Respite'

Melanie Day of Keller Williams Realty Outer Banks announced the historic list price of 101 Station One Lane, “A Welcome Respite”, the premier luxury oceanfront estate located on North Carolina's picturesque Outer Banks.

Do they ever shower on Outer Banks? ›

The Outer Banks teens do not shower. They may wash their face in a bird bath, or rub dry soap on their skin to fake appendicitis, or let a rainstorm briefly skim the top layer of grime off of their bodies while sprinting from a homicidal daddy. But they will not—I repeat: NOT—intentionally bathe if they can help it.

How long until OBX is underwater? ›

According to Climate Central, as of right now, a 100-year flood for the Outer Banks will be nine times more likely to occur by 2050 due to sea level rise. Hallac sees this increase right now.

Is it safe to swim in OBX? ›

Rip Currents and Ocean Swimming Safety

Though not to be taken lightly, shark attacks are incredibly rare on the Outer Banks and occur once every 20 years or so. Considering how many thousands of visitors hit the beaches, the odds are definitely in a swimmer's favor.

What is the best month to go to the Outer Banks? ›

The best time to visit the Outer Banks is between March and May or September and November, when lodging rates drop and crowds dissipate. Most mainland North Carolina residents and out-of-towners arrive during the summer months, when humidity is high and average temperatures consistently hit the upper 80s.

What is the best island to stay on in the Outer Banks? ›

While there are plenty of ideal places to stay, Roanoke Island is the best area in the Outer Banks for families. The combination of prime vacation rentals, incredible amenities, and an array of attractions and activities make this the perfect place for all ages!

Can you live in Outer Banks? ›

So if you're considering a move to the Outer Banks, rest assured that there's much more to life here than just tourism. With its stunning natural beauty, welcoming community, and perfect weather, the OBX is a slice of paradise year-round.

What is the lifecycle of Getx controller? ›

GetxController comes with lifecycle which replaces methods of StatefulWidgets . onInit() : It is called immediately after the widget is allocated memory. onReady() : It is called immediately after the widget is rendered on screen. onClose() : It is called just before the controller is deleted from memory.

How do you refresh data automatically in Flutter? ›

Description
  1. Create abstract class that should be able to reload data should implement [AutoReloader]
  2. Apply mixin on a child (that implements [AutoReloader])
  3. override [autoReload]
  4. call [startAutoReload] for start and [cancelAutoReload] for dispose.

How do you refresh data in Flutter? ›

RefreshIndicator is a widget in a flutter. It is used to update the data in the app. RefreshIndicator will trigger a refresh when the list is over-scrolled. It is showing a circular progress indicator if you want something to happen, add a callback function with the onRefrence property.

How do you refresh a function in Flutter? ›

In Android app you can implement swipe to refresh by wrapping your ListView(or GridView) inside SwipeRefreshLayout, while in iOS UIRefreshControl is used for same. A widget that supports the Material “swipe to refresh” idiom.

How to get data from API using GetX? ›

To Get Data from an OpenSea API Using GetX, Follow These Steps:
  1. Add the HTTP package and getx package in pubspec. yaml .
  2. Create a model based on your data.
  3. Create a GetX controller and make a network request using the http package.
  4. Display the data in an appropriate format.
Feb 8, 2023

How do I optimize my flutter app performance? ›

Best Practices to Improve Performance of Flutter App
  1. Table of Contents. Do Not Rebuild Widgets. ...
  2. Do Not Rebuild Widgets. ...
  3. Const Keyword Can Help Split Widgets. ...
  4. Async/Await. ...
  5. Keep the Opacity Widget to a Minimum. ...
  6. 16ms or Less. ...
  7. Only Render Visible Widgets. ...
  8. Avoid Using ListView For Longer Lists.
Aug 16, 2022

How do you refresh data? ›

The Ctrl + Alt + F5 key opens the Refresh Data dialog box.

How do I clear app cache data in Flutter? ›

Go to Tools > Flutter > Flutter Clean to clear the build cache of the Flutter project.

How do I hide the refresh indicator in Flutter? ›

To disable RefreshIndicator pass notificationPredicate function that returns false. After doing that refresh indicator won't be shown or onRefresh called.

What is pull down to refresh? ›

Pull-to-refresh lets a user pull down on a list of data using touch in order to retrieve more data. Pull-to-refresh is widely used on devices with a touch screen.

How do you reload and restart Flutter? ›

To hot reload a Flutter app:
  1. Run the app from a supported Flutter editor or a terminal window. ...
  2. Modify one of the Dart files in your project. ...
  3. If you're working in an IDE/editor that supports Flutter's IDE tools, select Save All ( cmd-s / ctrl-s ), or click the hot reload button on the toolbar.

How do you refresh a page in Flutter WebView? ›

To do it move the WebView to StatefulWidget (let's name it WebViewContainer) and pass onWebViewCreated callback to it. Now you are able to reload WebView by calling webViewController. reload() method. Second thing to do is to make reload trigger from outside.

How do you rebuild in Flutter? ›

Using setState to rebuild widgets

Flutter gives you access to setState() . In this case, we have to ensure setState() has the new values. When setState() is called, Flutter will know to get these new values and mark the widget that needs to be rebuilt.

References

Top Articles
Latest Posts
Article information

Author: Msgr. Benton Quitzon

Last Updated: 08/09/2023

Views: 6551

Rating: 4.2 / 5 (63 voted)

Reviews: 86% of readers found this page helpful

Author information

Name: Msgr. Benton Quitzon

Birthday: 2001-08-13

Address: 96487 Kris Cliff, Teresiafurt, WI 95201

Phone: +9418513585781

Job: Senior Designer

Hobby: Calligraphy, Rowing, Vacation, Geocaching, Web surfing, Electronics, Electronics

Introduction: My name is Msgr. Benton Quitzon, I am a comfortable, charming, thankful, happy, adventurous, handsome, precious person who loves writing and wants to share my knowledge and understanding with you.