Size: a a a

Dart & Flutter по-русски

2020 June 11

in Dart & Flutter по-русски
Roman Vasiliev
Сакфолд случается когда научившиеся на видосах начинают получать проблемы, которых в видосах не разбирали
У верстальщиков чаще бывает Дивитоз)
источник

SM

Sergey Molchanovsky in Dart & Flutter по-русски
Moby Polo
Ну хорошо, давайте в двух словах опишу архитектуру, сильно опуская подробности, может быть она у меня не совсем правильная и что-то упускаю.

Предположим у меня есть кнопка с каунтером, я нажимаю на нее и отправляю событие в БЛоК.
Кроме изменения стейта, я хочу это дело отправить на сервер.
Сам апи подразумевает, что я передаю некоторый токен в заголовках запрпоса.

От БЛоКа у меня идет репозиторий со всем апи от этой части.
Вот тут я хочу к чему то обратиться(хттп запрос), но с заданным токеном, при этом, я бы не хотел бойлерплейта в каждом методе от апи, который бы создавал дио-инстанс и откуда то извлекал мой токен. Как быть?
Покажи лучше скрин кода Блока и кода репозитория своего.
Иначе получается гадание на кофейной гуще.
источник

SM

Sergey Molchanovsky in Dart & Flutter по-русски
Под репозиторием понимается helper-класс с методами api?
источник

in Dart & Flutter по-русски
Moby Polo
Ну хорошо, давайте в двух словах опишу архитектуру, сильно опуская подробности, может быть она у меня не совсем правильная и что-то упускаю.

Предположим у меня есть кнопка с каунтером, я нажимаю на нее и отправляю событие в БЛоК.
Кроме изменения стейта, я хочу это дело отправить на сервер.
Сам апи подразумевает, что я передаю некоторый токен в заголовках запрпоса.

От БЛоКа у меня идет репозиторий со всем апи от этой части.
Вот тут я хочу к чему то обратиться(хттп запрос), но с заданным токеном, при этом, я бы не хотел бойлерплейта в каждом методе от апи, который бы создавал дио-инстанс и откуда то извлекал мой токен. Как быть?
Это называется "в двух словах"?)
источник

MP

Moby Polo in Dart & Flutter по-русски
Sergey Molchanovsky
Под репозиторием понимается helper-класс с методами api?
Ну если грубо, да
источник

MP

Moby Polo in Dart & Flutter по-русски
Sergey Molchanovsky
Покажи лучше скрин кода Блока и кода репозитория своего.
Иначе получается гадание на кофейной гуще.
Скриншотов много, там разве что в гит пригласить, но вопрос больше теоретический :)
источник

in Dart & Flutter по-русски
Moby Polo
Скриншотов много, там разве что в гит пригласить, но вопрос больше теоретический :)
юзай статик и не парься)
источник

MP

Moby Polo in Dart & Flutter по-русски
Это называется "в двух словах"?)
Вот в том и проблема, почему особо скрина не будет )
источник

MP

Moby Polo in Dart & Flutter по-русски
юзай статик и не парься)
Принято, в реализации factory, спасибо!
источник

SM

Sergey Molchanovsky in Dart & Flutter по-русски
Moby Polo
Принято, в реализации factory, спасибо!
На блоках сложно сообразить, я ими не особо пользуюсь.
Если бы я делал, я бы сделал AuthStore, который аутентифицируется, получает с сервера токен, и передает его в конструктор CounterStore.
И есть отдельно файлик с API типа такого (это я копипастю из инструкции по Retrofit):
dart
@RestApi(baseUrl: "https://5d42a6e2bc64f90014a56ca0.mockapi.io/api/v1/")
abstract class RestClient {
 factory RestClient(Dio dio, {String baseUrl}) = _RestClient;

 @Post("/counter")
 Future<int> postCounter(@Body() int count);
}


А в CounterStore создаешь свой Dio
final dio = Dio();
 dio.options.headers["token"] = token;
 final client = RestClient(dio);


И дергаешь из UI client.postCounter(42)
источник

SM

Sergey Molchanovsky in Dart & Flutter по-русски
С блоками плюс-минус то же самое, только там ты шлешь action с payload(42), он у себя в маппере разбирает экшены:
if (action == CounterChange) client.postCounter(payload)
и тебе возвращает стейт с обновленным каунтером
источник

SM

Sergey Molchanovsky in Dart & Flutter по-русски
Все равно сначала Auth, потом во все блоки, которым понадобится токен, закидываешь этот токен
источник

SM

Sergey Molchanovsky in Dart & Flutter по-русски
Где ты там собрался static или factory использовать, непонятно.
источник

MP

Moby Polo in Dart & Flutter по-русски
Sergey Molchanovsky
На блоках сложно сообразить, я ими не особо пользуюсь.
Если бы я делал, я бы сделал AuthStore, который аутентифицируется, получает с сервера токен, и передает его в конструктор CounterStore.
И есть отдельно файлик с API типа такого (это я копипастю из инструкции по Retrofit):
dart
@RestApi(baseUrl: "https://5d42a6e2bc64f90014a56ca0.mockapi.io/api/v1/")
abstract class RestClient {
 factory RestClient(Dio dio, {String baseUrl}) = _RestClient;

 @Post("/counter")
 Future<int> postCounter(@Body() int count);
}


А в CounterStore создаешь свой Dio
final dio = Dio();
 dio.options.headers["token"] = token;
 final client = RestClient(dio);


И дергаешь из UI client.postCounter(42)
Ну то есть везде создавать новый инстанс, да и доступа туда из UI нет, логика отвязана от представления и событие не является следствием, я просто пример упростил
источник

SM

Sergey Molchanovsky in Dart & Flutter по-русски
У тебя Dio() один раз создается в блоке, и далее делаешь через него запросы сколько хочешь
источник

SM

Sergey Molchanovsky in Dart & Flutter по-русски
Ну как это нет доступа из UI!
BlocBuilder тебе дает bloc
и можешь диспатчить bloc.add(postCounter)
источник

SM

Sergey Molchanovsky in Dart & Flutter по-русски
и считывать через bloc.state
источник

MP

Moby Polo in Dart & Flutter по-русски
Ладно, вопрос я в целом выяснил, во всяком случае, что бы покодить/попробовать.
А ui нет, например, у меня событие в сокетах слушает некоторый сервис и ответить я хочу не в сокет, а по хттп клиенту.
Спасибо )
источник

SM

Sergey Molchanovsky in Dart & Flutter по-русски
Ты бы попробовал для начала Provider + ChangeNotifier
Блок — это реально сложно.
источник

MP

Moby Polo in Dart & Flutter по-русски
Провайдер есть только там, где есть контекст
источник