Size: a a a

Flutter Developers — русскоговорящее сообщество

2021 March 27

SH

Sergey Hottabych in Flutter Developers — русскоговорящее сообщество
Pavel K
На мой взгляд, это две ситуации с абсолютно разных слоев и, соответственно, обработка у них должна быть разная
Первый кейс с Maintenance
Здесь это нормальное состояние приложения (не эксепшн), поэтому должно прокидываться до экрана
Я, к сожалению, не в курсе твоей архитектуры, но как пример - если у тебя есть некий AppState, который слушает один из виджетов, допустим через bloc, то это могло бы быть следующее

Widget build(BuildContext context) {
AppStateBloc bloc = Provider.of<AppStateBloc>(context);
return StreamBuilder(
 stream: bloc.appState,
 builder: (_, snapshot) {
  ... // разбор состояний snapshot опустим
  final AppState state = snapshot.data;
  if (state is MaintenanceState)
   return MaintenanceScreen(state) // можно передать state если там есть полезные данные для отображения на экране
  ...
  return HomeScreen()
 }
);
}


Случай с Unauthorized - это Service Layer. Допустим у тебя есть некий абстрактный класс Query и есть NetworkClient который умеет их выполнять

abstract class Query<T> {
...
}

abstract class NetworkClient {

Future<dynamic> execute(Query<dynamic> query);

}

Ну и соответственно, уровнем выше, скажем, есть у тебя Repository, который работает с этим клиентом и запросами
Так вот обработку Unathorized можно сделать централизованно внутри NetworkClient
То есть при запуске каждого Query он слушает результат - если прилетает нормальное значение - передаем в ответ
если прилетел Unauthorized - пытаемся отрефрешить токен и дергаем счетчик
если, скажем, три раза были неуспешными - тогда уже прокидываем какое-нибудь специальное состояние до Presentation Layer
где пользователю уже покажем соотв экран
Вот с сетью посоветуйте как разбить?
Сейчас есть один монолитный класс ApiHelper, с методом runQuery (дергает запрос на GraphQLClient, и он же пытается лезть в Auth и рефрешить токен), метод universalRequest (дергает runQuery с параметрами) и куча методов запроса конкретных данных (login, checkToken, transactions и т.д.), это всё эвэйт universalRequest с разным payload и возвращение результата. И всё это, вдобавок, тупо статикой сделано.
источник

PK

Pavel K in Flutter Developers — русскоговорящее сообщество
Sergey Hottabych
Вот с сетью посоветуйте как разбить?
Сейчас есть один монолитный класс ApiHelper, с методом runQuery (дергает запрос на GraphQLClient, и он же пытается лезть в Auth и рефрешить токен), метод universalRequest (дергает runQuery с параметрами) и куча методов запроса конкретных данных (login, checkToken, transactions и т.д.), это всё эвэйт universalRequest с разным payload и возвращение результата. И всё это, вдобавок, тупо статикой сделано.
а можешь в личку скинуть код класса? я просто с GraphQL только под чистым Android работал на Kotlin
не видел, как на Flutter реализовали
источник

SH

Sergey Hottabych in Flutter Developers — русскоговорящее сообщество
Pavel K
а можешь в личку скинуть код класса? я просто с GraphQL только под чистым Android работал на Kotlin
не видел, как на Flutter реализовали
Ну вот я тоже раньше не сталкивался.
источник

PK

Pavel K in Flutter Developers — русскоговорящее сообщество
что за либа используется?
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Pavel K
что за либа используется?
Друже, в дарте есть 2+- стоящие либы под гкл
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Артемис и ГрафКЛ
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Кодоген у артемиса еще ничего, но клиент пососный
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
А с графкл либой наоборот
источник

PK

Pavel K in Flutter Developers — русскоговорящее сообщество
@PlugFox спасибо )
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Сам клиент написан еще +- адекватно
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Но кодоген отвратительный
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Ну и в целом они средней степени паршивости.
Но можно скрестить
источник

SH

Sergey Hottabych in Flutter Developers — русскоговорящее сообщество
Артемис хорошо бы заюзать, сам об этом думал.
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
У графкл либы есть мидлвари, называются "линки"
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Pavel K
@PlugFox спасибо )
Незачто.
У вас транспортом графкл или просто выбираешь?
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
У нас просто корпоративным стандартом гкл идет.
Но я бы предпочел что то другое, например жрпц.
источник

PK

Pavel K in Flutter Developers — русскоговорящее сообщество
это @Hottabych c гкл на флаттер работает 🙂
я пока продолжаю с котлином воевать и на текущем проекте пока рестфул 🙁
от гкл отказались, а теперь костыли лепят
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Pavel K
это @Hottabych c гкл на флаттер работает 🙂
я пока продолжаю с котлином воевать и на текущем проекте пока рестфул 🙁
от гкл отказались, а теперь костыли лепят
Костыли летят потому, что схема нужна.
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Даже если просто рест
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Без схемы под контролем версий будет постоянный бардак
источник