Программирование : Dart & Flutter по-русски
Sergey Lavinov
Ну да, дебаунс окей, это по-умолчанию. А дальше в чем идея? Я все никак не уловлю, если даже с дебаунсом и тротлом бывает такое, что ответ не пришел к моменту, когда мне нужно отправить следующий запрос? Что происходит в этот момент?
???????
Ну если тупо asyncExpand/Map - оно будет ждать своей очереди в нем
Sergey Lavinov
То есть запрос 2 отправится только после получения ответа?
Fearless Cry
резюмируя: твоя идея - 1 запрос в 1 момент времени моя идея: нет ограничений на количество запросов, НО если запросы конкурентные (читай важен порядок их выполнения), то мы ставим их в очередь или делаем запрос через критическую секцию
???????
Причем такая магия на бэке еще более мастхэвна (но там её колдуют девопсы через RabbitMQ/NATS/Kafka)
???????
Вот Артем (и я) как раз про эти RabbitMQ/NATS/Kafka - на минималках одной строкой)
Fearless Cry
Можно написать более умную штуку - очередь коллбеков, то есть вызовы будут крутиться одновременно, но ответы обрабатываться в порядке вызова
Fearless Cry
стало интересно есть ли такое из коробки
(;?_?) Ivan Zhuravlev ???>?
Ммм, коллбэк хелл, каеф
Sergey Lavinov
Смотри, есть бэк на руби (не спрашивай) Есть поиск Я написал букву "а" и подождал, чтобы дебаунс отправил запрос. А он просто охренеть как долго выполняется. Пусть 10 секунд, ибо выдача с буквой "а" большая, а бэкендер положил на оптимизацию. Через 2 секунды я дописал "алёша", и этот запрос выполнится за 2 секунды. В вашем случае мне придется подождать ещё 8 секунд до первого ответа + 2 до второго? А если все же нет, и вы тут же отправите второй, что будете делать, когда придет ответ для первого?
(;?_?) Ivan Zhuravlev ???>?
Не отправлять запрос на одну бкуву
(;?_?) Ivan Zhuravlev ???>?
Минимум 2-3 :)
Sergey Lavinov
Ну я утрирую, Окей да?
Sergey Lavinov
Важен подход
Fearless Cry
ну ты прикинь ситуацию что есть некоторый бэкграунд воркер который дергает этот же метод апи
Fearless Cry
и какая то хуила на стороне нетворка канцелит твои запросы
Fearless Cry
казалось бы с чего
???????
Не один дебаунсер, а вместе с троттлом, паралельно, а то не очень то лайвсич)
Sergey Lavinov
Ответь на вопрос пж
Sergey Lavinov
И удали мат
Evgeny Cherkasov
И в интерфейсе получим непонятные пользователю обновления результатов, когда он уже совсем другой запрос сделал?
???????
А так, в этом случае полетит один запрос. Второй полетит когда первый вернется
Fearless Cry
так наоборот же
Aleksey
[
"м? ",
{
"type": "link",
"text": "https://api.flutter.dev/flutter/package-async_async/CancelableOperation-class.html"
},
""
]
Sergey Lavinov
Итого пользователь будет ждать 12 секунд свою выдачу?
Fearless Cry
да будет ждать 12 секунд (опять же утрируя , понятное дело что сильно меньше)
Evgeny Cherkasov
А как иначе? Если мы все запросы по очереди выполняем
Aleksey
просто отменяешь старый запрос, зачем его ждать
Sergey Lavinov
Или мы всё же признаем, что кенселить запросы - тру тема, и не все, что работает без стримов - хрень?)
???????
Ну зависит от того, можно ли тебе заспамливать бэк
Fearless Cry
ну ты можешь игнорить промежуточные
???????
Тут вопрос в грамотной настройке тротлинга и дебаунсера под тормознутость бэка
Fortune's Desire
Почему бы не подсмотреть как работает поисковик гугла? там же быстро предложения по дополнению вылетают
???????
Закидывая тормознутому бэку 100500 запросов - ты сделашеь только хуже
Sergey Lavinov
Так я к этому и веду. Господа не признали отмену запросов
Fearless Cry
канцелить запросы при любом чихе не круто
Fearless Cry
никогда не соглашусь что 1 запрос в 1 момент времени лучше чем подольше подождать
Evgeny Cherkasov
Лучше их вообще не отправлять
Sergey Lavinov
Ну тогда давай заставлять пользователей по 12 секунд)
???????
+ Более того, на бэке это так и будет реализовано
Sergey Lavinov
Понятно что есть дебаунс и это будет не каждый чих
Sergey Lavinov
Но без отмены совсем глупо
???????
На нормальном бэке, иначе будешь ловить ложащуюся СУБД
Fearless Cry
ты пойми что по одному апи методу могут стучаться разные модули и только часть этих запросов конкурентная
???????
Ты понимаешь, что на нормальном бэке будет энивэй тот же механизм, что описал Артем?
Fearless Cry
а тут ты будешь нехило так палки в колёса вставлять
IB Akhrorov
Dart одно поточный язык программирования????
???????
Если его не будет: бэк помрет (вероятнее всего СУБД кони двинет) или тебе прилетит охуеть какой круглый счет от фаербейса
Fearless Cry
в рамках одного изолята да
IB Akhrorov
Я читал документацию этот момент хорошо не понял , т е в одном потоке дарт создает отдельные stacks?
Fearless Cry
один изолят - один поток, один стек и одна куча
Sergey Lavinov
Проблемы бэка - это проблемы бэка. Я позаботился о нем, добавив дебаунс. Но заставлять пользователя ждать, когда можно не ждать - неприлично)
Aleksey
про это есть крутое видео на канале флатера
IB Akhrorov
какая разница между isolate и thread?
Fearless Cry
ещё раз - говорю: у тебя с нескольких мест можно стучаться к апи и зхапросы будут не конкурентными
Evgeny Cherkasov
надо на клиенте сохранять последнее условие поиска, после некоторой задержки отправлять запрос с этим условием, следующий запрос отправлять после получения результата от предыдущего, если условие поиска изменилось
Fearless Cry
но ты убьёшь всех и оставишь только 1
???????
Ну если есть проблема со ждать, отправив множество запросов - ты сделаешь только значительно хуже в целом (как себе так и бэку)
Fearless Cry
я бы не писал про этот кейс если бы у меня его не было
Fearless Cry
но я явно с ним столкнулся
Fearless Cry
поэтому твоё решение мне не помогает
Sergey Lavinov
Воу, погоди, это с чего? Я отменяю тот запрос, на который у меня есть токен. Я не хлопаю весь апи клиент
Sergey Lavinov
но ты убьёшь всех и оставишь только 1
IB Akhrorov
Видео про event loop and isolate?
Fearless Cry
ты хлопаешь все запросы одного эндпойнта
(;?_?) Ivan Zhuravlev ???>?
Ты свой отменяешь
(;?_?) Ivan Zhuravlev ???>?
А бэк уже ищет
Sergey Lavinov
Ну, жаль бэк
???????
Ты не можешь убить future и сам http запрос в процессе
Sergey Lavinov
Да, я не могу отменить факт запроса
Sergey Lavinov
И бэк его отработает
(;?_?) Ivan Zhuravlev ???>?
Бестолку
IB Akhrorov
Как то там заморочено или я не очень хорошо понял , event loops и isolate заменяют thread на языке dart?
???????
Именно, отправив 100 запросов ты не сделаешь в перспективе лучше, особенно если бэк фиговый, как ты говоришь
Sergey Lavinov
Это очевидно. Нужна золотая середина, чтобы не грузить бэк (дебаунс) и не заставлять ждать пользователя (кэнсел токен)
???????
Будет только значительно хуже
Fearless Cry
так ты и так заставишь юзера ждать
Fearless Cry
ты же уже отправил запрос
???????
Ты положишь фиговый бэк и будут ждать другие пользователи.
???????
Более того, нормальные API'хи ограничивают количество вызовов
Aleksey
в дарте один поток в котором крутится евент луп и создает асинхронность
???????
[
"Из лайвсич, вот вам к примеру ",
{
"type": "link",
"text": "dadata.ru"
},
" (Думаю все знают), pipedrive"
]
Fearless Cry
в рамках одного изолята*
Aleksey
для второго потока надо создавать изолят
IB Akhrorov
Значит все таки есть потоки в дарте?
Sergey Lavinov
Положу бэк запросами поиска? Ну тогда надо менять бэкендера. Я все же на стороне пользователя Если бэк отработает 4 запроса, а не 2 - не такая большая беда
(;?_?) Ivan Zhuravlev ???>?
Синхрофазотрон
Aleksey
ага, пойди доку про го почитай, как короутины через пайпы общаются, вот там сложно, а тут один поток, изи
???????
Положишь фиговый. Нормальный - работает именно по тому механизму что описал Артем.
???????
Тобишь уже ТАМ твои запросы встанут в точно такуюже ОЧЕРЕДЬ
???????
И ты только потратишь трафик и производственные мощностя в пустую.
IB Akhrorov
[
{
"type": "mention",
"text": "@FRapra1"
},
" ",
{
"type": "mention",
"text": "@pretorean"
},
" спасибо )"
]
???????
[
{
"type": "mention",
"text": "@lavinov"
},
" твои запросы будут прилетать вот в такую штуку\n",
{
"type": "link",
"text": "https://en.wikipedia.org/wiki/Message_broker"
},
"\n\nПо сути это один большой Стрим с твоим компьютером и механизм описаный Артемом)"
]
Dmitry Zakharov
Лол лайвсерч а запросы в брокер?
Dmitry Zakharov
Или это пример?
Aleksey
чтото ты путаешь теплое с мягким
Sergey Lavinov
Не обязательно, существуют балансировщики, которые разрулят нагрузку. Я конечно с бэком мало знаком, но по-моему далеко не везде используются брокеры
IB Akhrorov
[
"И последний вопрос про либ http, я хотел сделать request на n ый сервер с m ый портом , как это мне сделать используя http либ, я сделал так get('",
{
"type": "link",
"text": "https://ss.com:8000/api/"
},
"') я правильно сделал?"
]
???????
У тебя запрос до 10 секунд же, не?) Там будет брокер, не сомневайся, иначе датацентр выгорит до тла.
IB Akhrorov
У мя такой еррор
IB Akhrorov
Он там меняет сам порт
Dmitry Zakharov
Вот я прочитал все это это и говорит что ни мутексы ни синхронайзед ни чё такое не нужно для такой простой задачи как лайв серч) и вы изначально усложняете то что изи...
Sergey Lavinov
Не буду спорить, не шарю за бэк, лучше спрошу завтра у своих бэков
Dmitry Zakharov
И конкурент запросы не нужны
Dmitry Zakharov
Дичь пишете
IB Akhrorov
[
{
"type": "mention",
"text": "@PlugFox"
},
" Мудрая лиса что посоветуете"
]
???????
Так и говори: у меня в теории запросы выполняются по 10 секунд, бэк долго думает. Стоит ли мне запилить asyncExpand и вам брокер или хуярим как оно есть и СУБД у нас не упадет, когда во время пиковой нагрузки от клиентов все достанут телефоны.
Sergey Lavinov
Давай обойдёмся без мата и чуть менее агрессивно)
Sergey Lavinov
Я обсужу это завтра с шарящими ребятами, могу после этого написать)
???????
А, не, я не на тебя ругаюсь) Не подумай) Тебя я уважаю, просто стиль изложения такой)
Sergey Lavinov
Да все ок, но как минимум мат здесь, вроде, вне закона)
???????
В браузере если вставишь этот URL в адресную строку - все откроется?
IB Akhrorov
[
{
"type": "link",
"text": "https://t.me/rudart/158190"
}
]
???????
Ну и ты мне предлагаешь переписывать сидеть?
Валерий
Лично я попробовал вставить твой URL в браузер и ничего не получил в итоге
???????
[
{
"type": "link",
"text": "gist.github.com"
}
]
IB Akhrorov
404? Или что другое?
???????
Там тыща причин может быть, включая инвалидный сертификат. Пусть напишет нормально url.
Валерий
Connection timeout
Валерий
[
{
"type": "link",
"text": "https://educity.hopto.org:433/api/"
},
" я перепечатал)"
]
???????
который 100% работает в браузере и 100% не работает в дарте
IB Akhrorov
[
{
"type": "link",
"text": "https://pastebin.com/55jy2Cfi"
}
]
Валерий
работает, я в порту ошибся.
Валерий
поэтому лучше сразу давать ссылки а не заставлять людей перепечатывать
IB Akhrorov
Но у меня в приложение не работает
IB Akhrorov
Но интересно chrome сам порт находить
???????
443 порт по умолчанию для https
???????
В данном случае хром и порт тут не при чем и его можно не указывать (или указывать)
IB Akhrorov
Почему такая ошибка может возникнуть
Валерий
я попробовал себя в роли ванги у меня не вышло, все же для того чтобы сказать из за чего может быть ошибка мне нужно видеть весь код
IB Akhrorov
Спасибо Мудрая лиса
IB Akhrorov
Вроде я нашел ошибку
Eugene
Всем привет, кто-нибудь занимался подпиской на топики в firebase messaging? У меня вопрос, это нормальная практика подписываться на тот же топик при каждом запуске приложения
Eugene
Я думал стоит подписаться один раз. Но сейчас тестировал и понял, что сообщения перестали доходить
ilx13
к аппбару установил цвет так: backgroundColor: Color(0xFFFF1744), можно ли как то при клике на баттон изменить его?
???????
Можно конечно, перерисовать надо) в StreamBuilder заверни Scaffold или MaterialApp
Fearless Cry
да тут можно и сетСтейт
Fearless Cry
перерисовывать столько же если скаффолд в корне билда
???????
Ну да. От архитектуры зависит, просто сам факт установки цвета appbar'у - довольно сомнительное действие
???????
Оперировать лучше темой MaterialApp
???????
Потому и сказал про StreamBuilder над онным
ilx13
когда этот Color(0xFFFF1111) задаю в backgroundColor: для appBar работает. а когда через переменный делаю показывает только серый. в переменный определяю так var appBarColor = new Color(0xFFFF1111);
ilx13
var appBarColor = new Color(0xFFFF1111); ... appBar: AppBar( backgroundColor: appBarColor, title: appBarText, ),
ilx13
если прямо на backgroundColor указать цвет правильно работает
ilx13
в чем может быть проблема?
ilx13
а все решалось перезагрузкой симулятора) сорри за флуд
???????
var, особенно для публичных полей класса - очень плохо Color(0x0) без const - не хорошо сам по себе appBarColor как публичный член класса, да еще и не иммутабельный (вряд ли ты обрабатываешь сеттер) - очень плохо Управление темой не через тему MaterialApp а некими магическими константами разбросанными по всему приложению - очень плохо А проблема у тебя была в сохранившемся стейте, судя по всему, хот релоад его справедливо не обновляет (в этом и смысл)
ilx13
мне всего лишь на два разных цвета поменять походу дела. все равно может быть проблемы?
ilx13
и да, каким пикером можно получить цвет формата 0xFFFF1111. как узнал какой то андроидовский
???????
Проблемы ты таким написанием создашь "будущему себе" и не дай бог с тобой паралельно кто то будет разрабатывать
???????
Это обычная HEX запись цвета)
ilx13
хекс не 6 символов будет?
Fearless Cry
Байт на альфу ещё
???????
Ты про transparent забыл
Fearless Cry
0xargb формат
???????
[
"Хоть из фотожопа, хоть в гугле ",
{
"type": "code",
"text": "hex color online"
},
""
]
ilx13
[
{
"type": "hashtag",
"text": "#772cb5"
},
" не это ли хекс?"
]
Fearless Cry
Только числом будет 0xff772cb5
ilx13
получается только и в начале ff ставить?
???????
Да, если не прозрачный
???????
7f если 50% прозрачность
???????
00 если полностью
???????
Ну и по аналогии)
Fearless Cry
Вместо ff ставишь свою прозрачность. Если цвет непрозрачный оставляешь ff
ilx13
все ясно понятно. Благодарю вас))
Fearless Cry
А запись 0x это просто формат представления числа в 16-ричной системе счисления
ilx13
в моем приложении будет два вида статуса, соответственными цветами в аппбаре. я меняю их с ивента через setState(). Лис ты сказал что это дикость. Считаешь это не правильно? сделать через стримбилдер?
???????
не в этом проблема
???????
Проблема в том, что ты меняешь их по месту, чорт знает где
???????
Ты этот цвет должен получать из MaterialApp, у него есть поле themeData (ну или как там)
???????
И менять именно там, а не чорт пойми как, чорт знает где
???????
Так будет правильно. Если не сообразишь как это организовать, ну чтож, возьми на карандаш как точку роста. Как начнет хоть что то в архитектуре получатся - попробуешь еще разок.
???????
[
"Вот это поле MaterialApp\n",
{
"type": "link",
"text": "https://api.flutter.dev/flutter/material/MaterialApp/theme.html"
},
"\n\nВ него устанавливается ThemeData\n\nУ ThemeData вот это поле отвечает за цвета AppBar\n",
{
"type": "link",
"text": "https://api.flutter.dev/flutter/material/ThemeData/primaryColor.html"
},
""
]
ilx13
Да. При запуске тут и устанавливаю. Просто при смене статуса зову сетСтейт.
???????
Ну зови, только не у Scaffold'а, а у MaterialApp
???????
[
"Вот тут можешь открыть Drawer, там настройки и там покликать по темам.\nУвидишь, что сразу все перерисуется и везде.\n",
{
"type": "link",
"text": "https://awesome-1c.web.app"
},
""
]
ilx13
Спасибо большой друг за помощь
???????
Естественно там же ты можешь оперировать вообще всеми цветами, например устанавливать темную тему оформления
???????
А локально по Scaffold'ам там какиет цвета менять - сам себя мучать будешь. Как это все делать правильно - придет со временем, не переживай)
ilx13
Очень благодарен тебе. Сильно упростил задачу да и мотивировал)))
Artem K
Не знаю, насколько актуален такой вопрос тут, но может кто мудрый подскажет. Кто какой рекламной сеткой пользуется для айос и для андроид? В частности, в формате короткой видео рекламы.
ilx13
как можно завернуть в условие показ или непоказ виджета? например floatactionbutton если s==0.
???????
[
{
"type": "code",
"text": "condition ? Widget() : null"
}
]
|