Witam.
W związku z tym, że sporo osób (nie tylko tutaj) odradza korzystanie z GetX, ponieważ jest "do wszystkiego". Postanowiłem pochylić się nad Riverpod. Problem polega na tym, że ja nie potrafię przełożyć dokumentacji, tutoriali na mój projekt. Nie potrafię zrozumieć providerów.
PRZYKŁAD
-
Lista dokumentów - wstępnie powinno być
FutureProvider
, ponieważ dokumenty są pobierane z API, ale...
a. co z filtrowaniem?
b. co z szukajką?
c. czy to wtedy już jestStateNotifierProvider
?
d. szukajka jest uruchamiana zAppBar
- czy tzn, żeConsumer
powinien być na całyScaffold
? Coś czuje, że to kiepsko wydajne... -
Nowy/Edycja dokumentu - jak ogarnąć tworzenie, edycję obiektu. Muszę pobrać na formatkę formy płatności, kontrahentów, towary.
a. dodatkowa logika, w której wybór kontrahenta decyduje o terminie płatności (w przypadku przelewu)
b. przeliczanie netto, vat, brutto po dodaniu lub zmodyfikowaniu pozycji dokumentu
c. serwis, który ogarnia zaznaczanie pozycji na dokumencie, aby wykonać jakąś operację "hurtowo" (usuwanie, zmiana ilości) -
Koszyk zakupów - to akurat nie musi być serwerowe. Koszyk może być lokalnie więc tutaj zapytań do API nie będzie ale
a. ilość towarów w koszyku powinna się pokazać/odświeżać na głównej stronie.
b. tutaj również dobry byłby serwis, który ogarnia zaznaczanie i hurtowe operacje
c. z koszyka przechodzimy na zamówienie (nowy dokument)
Do tego wszystkiego dochodzą takie rzeczy jak konfiguracja aplikacji - dostęp do SharedPreferences
z każdego widgeta, w tym też z każdego providera, ponieważ tam będzie zapisany token do API. Może też jakiś provider do zmiany motywu aplikacji (jasny/ciemny).
W GetX
mam kontrolery, które mogą mieć obiekty z .obs()
i działają jak Angularowe Observable
. Wystarczy, że stworzę Obx(() => MojWidget(controller.documents.value))
i wszystko mi się ładnie zmienia i aktualizuje w momencie zmiany filtra czy wyszukania czegoś.
class DocumentsController extends GetxController {
var isLoading = false.obs;
var parameters = {
"filters": "",
"search": "",
"orderBy": "",
"page": "0",
"limit": "10",
}.obs;
var documents = DocumentsResponse().obs;
final HttpService httpService = Get.find();
void get(int type) async {
isLoading(true);
final response = await httpService.get("documents/type/$type", parameters);
if (response.statusCode == 200) {
var json = jsonDecode(response.body);
documents(DocumentsResponse.fromJson(json));
}
isLoading(false);
}
void search(int type, String searchText) async {
isLoading(true);
final response = await httpService.get("documents/type/$type", parameters);
if (response.statusCode == 200) {
var json = jsonDecode(response.body);
documents(DocumentsResponse.fromJson(json));
}
isLoading(false);
}
Zatrzymałem się na GetBuilder()
, GetX()
, Obx()
i GetView<ControllerClass>
- czy tylko mnie się wydaje, że tego jest za dużo, a robi to samo?
PS.
Do Riverpod robię już piąte podejście. Tak jak trochę mi zajęło na zrozumienie GetX'a, tak pewnie potrzebuje trochę czasu na ogarnięcie Riverpod. A projekt jest dość duży i nie chciałbym się uwalić z czymś czego później nie rozbuduje. Na reddicie, jako alternatywa, dla całego GetX'a były - get_it
, auto_route
, riverpod
/provider
. Niektórzy też twierdzą, że BLoC jest dobry, ale dla mnie to przeinżynierowany boilerplate.
Czy ktoś byłby w stanie na przykładzie mojego kontrolera pokazać jakby to wyglądało z Riverpod?