Программирование : Dart & Flutter по-русски
Rinat Kurmashev
У них там чёт не очень всё хорошо с этим
Serge Shkurko
А в чем собственно проблема
Serge Shkurko
Какие данные не шарятся
Serge Shkurko
onBackgroundMessage можно не использовать
Serge Shkurko
Тебе нужно запустить при сообщении определенный экран с определенными данными при нажатии на пуш?
Vladimir Brejcha
мы делаем аутентификацию по пушу и показываем уведомление о входящем звонке. Проблема в том что инстанс входящего звонка приходит на тот изолэйт откуда был произведен логин (то есть бэкграунд мессадж изолэйт). А на изолэйте на котором запущено приложение и его юай звонка естественно нет (по переходу из нотификации невозможно воспользовать данными так как их нет)
Vladimir Brejcha
инстанс невозможно воссоздать так что шэринг через локальную базу данных отпадает
Vladimir Brejcha
аутентификация на пуше нужна чтобы отменить нотификацию в случае отмены звонка
Serge Shkurko
[
"ну вот смотри, у меня к примеру такая конфигурация\n",
{
"type": "pre",
"text": "_firebaseMessaging ??= FirebaseMessaging()\n ..configure(\n onMessage: _onMessage, // in app message\n onResume: _onBackgroundMessage, // tap on system notification\n onLaunch: _onBackgroundMessage,// tap on system notification\n )",
"language": ""
},
"\n\nЕсли приложение не запущено - запускается onLaunch, все данные не в изоляте, спокойно работаю в основном потоке \nЕсли запущено и в фоне - запускается onResume с данными все так же"
]
Serge Shkurko
onBackgroundMessage на ios вообще exception бросает
Vladimir Brejcha
[
"у меня такая конфигурация (нужно хэндлить только бэкграунд и мертвый стейты)\n_firebaseMessaging.configure(onBackgroundMessage: ",
{
"type": "italic",
"text": "backgroundMessageHandler"
},
");"
]
Vladimir Brejcha
если приложение не запущено и пришел пуш, вызовется onLaunch?
Serge Shkurko
при тапе да
Vladimir Brejcha
тапе куда?
Vladimir Brejcha
пуш приходит в код, чтобы было куда тапать нужно показать нотификацию не?
Serge Shkurko
ну, только в том случае когда приложение запущенно
Serge Shkurko
[
"вызывается ",
{
"type": "code",
"text": "onMessage"
},
""
]
Serge Shkurko
проблема была в том что на ios 2 делегата уведомлений нельзя было поставить
Serge Shkurko
приходилось когда приложение запущенно отображать самосверстанные уведомления в самом приложении (не через центр системных уведомлений)
?
Без него текст еще страшнее, поверь)
Serge Shkurko
но недавно это пофиксили и можно назначить несколько делегатов
Serge Shkurko
по этому в onMessage можно добавить local_notifications или как-то так пакет называется
Vladimir Brejcha
не понял, если приложение мертвое и придет пуш то где ты его хэндлишь?
Александр Саньков
Ну понятно, там стиль теряется без него
Serge Shkurko
[
{
"type": "code",
"text": "onLaunch"
}
]
Vladimir Brejcha
система сама показывает пользователю уведомление?? как это сделать?
Serge Shkurko
сама, ничего для этого делать не надо
Serge Shkurko
[
"главное чтобы приложение было закрыто (",
{
"type": "code",
"text": "onLaunch"
},
")\nили хотябы в фоне (",
{
"type": "code",
"text": "onResume"
},
")\n\nесли запущенно то - ",
{
"type": "code",
"text": "onMessage"
},
""
]
Vladimir Brejcha
Это круто, не знал. Но все равно к сожалению моей проблеме это мало поможет, мне нужно выполнять код до onLanch, а как раз таки этот код выполняется в изоляте, данные из которого потом не понятно как достать
Serge Shkurko
[
{
"type": "link",
"text": "https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_messaging#receiving-messages"
}
]
Vladimir Brejcha
эту доку я уже наизусть знаю))
Serge Shkurko
[
"ну вот смотри\nты получаешь пуш в котором в качестве доп данных содержится инфа, к примеру кто звонит\nу пользователя приложение выключенно, он тапает по пушу\nу тебя вызывается ",
{
"type": "code",
"text": "onLaunch"
},
"\nк моменту вызова ",
{
"type": "code",
"text": "onLaunch"
},
" все приложение уже подгруженно (со всеми данными и экранами)"
]
Serge Shkurko
ты в основном потоке с ui
Serge Shkurko
для того что выполняется в запущенном тобой изоляте есть интерфейс port
Vladimir Brejcha
если бы все было так просто)))
Serge Shkurko
или как-то так
Vladimir Brejcha
я получаю пуш и выполняю код в результате которого получаю данные
Vladimir Brejcha
только после этого я показываю нотификацию пользователю
Vladimir Brejcha
эти данные мне нужны на юае, но их не получается расшарить туда, так как это два разных изолята
Serge Shkurko
аа, теперь понятно, тут уже не подскажу
Dmitriy
[
"В общем в следствии эксперементов выяснилось, что если сделать так \n ",
{
"type": "mention",
"text": "@override"
},
"\n Stream mapEventToState(MyEvent event) async* {\n if(event is myEvent)\n await for (v data in streamData) {\n yield myState();\n }\n else if(event is otherEvent )\n\nто больше новые ивенты не приходят в блок, поэтому нужно подписку делать, через listen() и в нем уже бросать внутренний ивент, через add()"
]
???????
Яж говорил про это 100500 раз
???????
У тебя в блоке, под капотом по умолчанию asyncExpand
???????
Он служит для того, чтоб сохранялась очередность событий
???????
[
"Фелангелом предусмотрена его замена (это даже в комментах к нему написано) через ",
{
"type": "code",
"text": "@override"
},
""
]
Safort
Всем привет! Гайз, подскажите, пожалуйста, почему дарт ругается? Не понимаю, что не так с типами(
???????
Но из коробки - один эвент за раз и пока он не обработается - следующего не будет
???????
[
"Алсо, в mapEventToState не стоит ничего писать кроме ",
{
"type": "code",
"text": "if (event is Event)"
},
" в противном случае у тебя быстренько нечитабельная простынка получится"
]
Dmitriy
Ивент то обрабатывается внутри цикла, но дальше, другие не приходят
???????
ВСЕ ПРИХОДИТ, просто ждет своей очереди
???????
Пока предидущий эвент не завершится
Dmitriy
Получается предыдущий не завершается
???????
Ну кто в этом виноват?)
Dmitriy
возможность использования await for))
???????
[
"Хочешь использовать длительный разбор эвентов (хотя тут у тебя это желание не очень то обосновано, тут скорее выглядит как ",
{
"type": "code",
"text": "states.where(),map()"
},
" - пиши стримтрансформер на замену asyncExpand"
]
???????
По умолчанию идет именно asyncExpand и там даже написано почему - чтоб сохранить очередность
???????
Помогу если укажешь типы по человечески и выкинешь все var на помойку.
Safort
Так?) Там один единственный var был)
???????
[
"У final забыл тип и у списков [] дженерик)\n\nНу и выложи куданить код, лучше всего в гист (",
{
"type": "link",
"text": "gist.github.com"
},
") и чтоб запускалось в дартпаде."
]
Evgenii Elchev
Ты же в курсе что дарт типы выводит?
???????
Ты ведь в курсе, что у людей проблемы с типами именно из за того, что они их опускают?
Vladimir Brejcha
если компилятор норм то опускай не опускай ошибки не допустишь)) но это не про дарт
???????
У дарта все норм с этим
Safort
Ну, в данном случае не из-за этого.
Vladimir Brejcha
То что для тебя норм, для меня выглядит очень слабой типизацией
Evgenii Elchev
Хз, в Swift никто не пишет и проблем нет) но там да, ide красненьким подчёркивает в месте ошибки)
Evgenii Elchev
И не собирается ничего
???????
У людей ошибки с типами именно потому, что они проставляют var и сами не понимают, что у них происходит
???????
Если у тебя будет var (в приватной переменной или внутри функции) - я вайнить не буду
???????
Ну по крайней мере пока не поимеешь ошибку с типом)
???????
Но когда ты сам не понимаешь где у тебя и чего - проставлять var, объективно, крайне фиговая мысля, не дающая ровным счетом ничего.
Evgenii Elchev
Я три года преподаю, но один ученик типы не ставит, это противоречит гайдлайнам, и ни у кого нет проблем с типами. За то правда со всем остальным есть)
???????
В ошибке у парня нет ошибки с типами?
Fearless Cry
в свифте муторно ставить типы потому что var/let всё равно обязательный
Fearless Cry
итого получается что ты и вар написал и тип указал
Fearless Cry
ну и выглядит это не очень из-за того что тип указывается справа от названия
Evgenii Elchev
Ну let намного короче чем SomeAwesomeTypeOfClass
Fearless Cry
да, но если тебе скажут указывать всегда типы
Fearless Cry
то это будет let abc: SomeAwesomeTypeOfClass
Evgenii Elchev
Ну так он не понимает что написал)
Fearless Cry
а потом ещё и равно и выражение
Evgenii Elchev
Не, это будет let abc =
???????
Ну так що не так? Я потому и говорю - не знаешь на 100% где у тебя и что - ОБЯЗАТЕЛЬНО ставь тип
Fearless Cry
ну этож не по гайдлайнам
Evgenii Elchev
Ибо тип выведется, как и в дарте)
Evgenii Elchev
Это как раз по гайдлайнам
Fearless Cry
>>>но один ученик типы не ставит, это противоречит гайдлайнам
???????
Как только будешь не отрываясь от почесывания жепы одним глазом читать свой код - можешь перестать делать это для приватных (это, кстати, из эффектив дарта, вроде, линт)
Evgenii Elchev
Там в доке языка написано, не ставьте типы, вам их компилятор выведет
Fearless Cry
либо опечатка либо я не всасываю)
Evgenii Elchev
Ну, типы ставить не по гайдлайнам)
Fearless Cry
не ставит типы -> противоречит гайдлайнам
Evgenii Elchev
Кстати я кажется в дарте тоже самое видел
Fearless Cry
а, это уже типо следующее утверждение
Evgenii Elchev
Он не ставит типы, ставить типы не по гайдлайнам
Fearless Cry
я понял понял
???????
Это из эффектив дарта
Fearless Cry
просто предложение непонятно составил
???????
Это касается только тела функций
Evgenii Elchev
Вроде всего
Evgenii Elchev
Ну вернее возвращаемый тип то да, надо описывать
???????
Публичный интерфейс надо типы проставлять
Vladimir Brejcha
Типы после > типы до
Fearless Cry
var в дарте плох тем что не обязывает указывать тип если к нему не присваивается выражение сразу
Fearless Cry
тогда это становится дайнамиком
Fearless Cry
что как бы вызывает проблемы
Fearless Cry
и привыкание
???????
И да, это все не касается тех, кто на 100% не понимает что делает их код. Это уже я сказал
Fearless Cry
а потом смерть от ожогов жопы
???????
Удваиваю сего мудреца)
???????
[
"Держи.\nЭто один из 2 линтов педантика, что у меня заигнорирован.\n",
{
"type": "link",
"text": "https://dart-lang.github.io/linter/lints/omit_local_variable_types.html"
},
""
]
Evgenii Elchev
Ну я так не пишу. Опять же Swift приучил. Не делаешь присваивание, укажи тип.
Safort
Ты про меня? Ммм, как оказалось, у меня всё в полном порядке, это тулзы флаттера/дарта оказались бажными. Я вырезал для тебя пример на дартпаде, но он завёлся. Посмотрел локально - тоже завелось. Откатился к изначальному коду (у которого якобы были проблемы с типами) и он тоже завёлся.
???????
У тебя просто стейт сохранился там, наверняка
???????
Это не баг, это специальная фича хотрелоада (если я правильно предположил)
Evgenii Elchev
Зачем оно мне?)
Safort
Я перезагружал, но всё равно ошибка была.
???????
Ну ты аппелировал именно к этому линту из гайда эффектив дарта)
???????
Будет теперь ссылочка)
Fearless Cry
Так я ж не про тебя
Fearless Cry
просто в общем
Fearless Cry
ну и в дарте нету val/let
Fearless Cry
тоже не очень
???????
[
"Смотри что нашел)\n",
{
"type": "link",
"text": "https://dart-lang.github.io/linter/lints/always_specify_types.html"
},
""
]
???????
Моя новая прелесть c:
Dmitriy Orteney
[
"а как же ",
{
"type": "code",
"text": "final a = 5;"
},
""
]
???????
let это другое (по крайней мере в js) насколько помню
Dmitriy Orteney
ну тут котлин / свифт я так полагаю)
???????
Хоть и не люблю весь этот курятник со слабой типизацией
Dmitriy
Не просто так в java строгая типизация, это для того, чтобы меньше было способов себе в ногу выстрелить
???????
А если выстрелишь - сразу узнаешь об этом
Fearless Cry
нуууууууууууууууууууу такое
Evgenii Elchev
Ну тот же let
Fearless Cry
ну оно контрастирует с var
Fearless Cry
то есть var/final не аналогия var/let
Fearless Cry
потому что после final ты всё ещё можешь указать типы
Evgenii Elchev
Так и после let тоже
Fearless Cry
но после var в дарте нельзя
Evgenii Elchev
Я ничего не понимаю уже)
Алексей Анисов
Var/let в свифте к типам не относятся же, это про мутабельность
Алексей Анисов
А var в дарте типо авто тип
Evgenii Elchev
Ну а final это не про мутабельнгсть?
Hateful
Народ, всем привет. Я ещё новичек, поэтому прошу с пониманием отнестись. У меня чисто архитектурный вопрос так сказать. Есть собственная api которая отдает информацию в мое приложение из документооборота. Это все задачи, общая кадровая информация и т.п. С этим проблем нет. Но встала задача каждому юзеру присобачить аватар который можно загружать из галереи или сразу с камеры. С этим проблем тоже не возникло. Image picker покурили. Но тут встал вопрос, а как сохранить(закрепить) выбранный аватар за пользователем что бы, во первых, при повторном открытии приложения он сразу встал на свое место и чтобы при получении списка задач я мог видеть аватары других пользователей которые мне задачи ставили. Я так понимаю что после выбора картинки мне ее надо вернуть на сервак в сво сервис и закрепить за пользователем, что бы при повторной авторизации в бинарке ее получить и отобразить картинкой, так же и с задачами получается?Когда я через свой api буду получать список задач в json'не я ещё буду получать аватары каждого пользователя в двоичных данных?Можете посоветовать как лучше всего организовать данный процесс?
Evgenii Elchev
А хотя тут нельзя поставить final без типа, точно. Я понял
?
Это как понимать? Добавил 5 картинок общим размером 150 кб, так размер релиз apk из 7,7мб вырос до 40мб
Fearless Cry
ну вообще лучше отправлять на сервер картинку а потом получать от него ссылку
Roman Vasiliev
Анализатор апк вроде существует
Алексей Анисов
Ну я имею ввиду что вар это не то что в свифте, финал да
???????
Смотри, если хочешь кидать аватар в JSON - можешь посмотреть в сторону base64
Hateful
Но я не могу от него получить прямую ссылку на картинку формата "картинка.jpg". Я могу только двоичку получать
???????
Смотри дальше. В идеале для этого выделить formData и отправлять все в нем
???????
да, так лучше ненада делать
Roman Vasiliev
В Android Studio встроен
Fearless Cry
это кто тебе сказал?
Evgenii Elchev
Тогда ниче не понимаю)
???????
Если пользователь может видеть аватары других пользователей, то formData ты за раз отправляй все аватары
Evgenii Elchev
Чем let a = 5 отличается от final a = 5?
???????
Чоэто не можешь?) Что у тебя на бэке?
Fearless Cry
final a; - вот так можно написать
Evgenii Elchev
Ну let тоже)
Evgenii Elchev
И типо динамик?
Fearless Cry
как и var a;
Evgenii Elchev
И это единственное отличие?
Fearless Cry
ну единственное но какое....
Hateful
Ну база то 1с, api я писал. И если честно я понятия не имею как через api передать картинку ссылкой. То есть да, у меня в самом документообороте есть аватар пользователя но по факту в базе он храниться в base64 а 1с его выводит картинкой
Serge Shkurko
смотря из какого языка let в js это далеко не константное значение, скорее наоборот тот же var с ограниченым скопом
???????
Пойдем в группу 1с - объясню
???????
[
{
"type": "link",
"text": "https://t.me/ru_1c"
}
]
Evgenii Elchev
А что этом «ну такого»?
Fearless Cry
ну так не надо хранить картинку в базе…
Fearless Cry
не НУ такого а НО такого)
Hateful
Можно пример или ссылку как это можно сделать через http сервис?Я извиняюсь если вопрос глупый, никогда просто этим вопросом не занимался
Fearless Cry
ну бля это опять дайнамики
???????
Все там можно хранить)
Fearless Cry
можно, но не нужно
???????
Можно, но не в группе дарта
Evgenii Elchev
Ну все равно. Просто особенность, и надо о ней знать
Hateful
Присоединился уже
Алексей Анисов
На 1с можно
???????
Там специальное хранилище для двоичных данных и хранит оно его в специальном хранилище MS SQL специально заточенным под файлы
???????
Но это все оффтоп
Fearless Cry
Я же сказал что можно… Просто не нужно
|