Программирование : Dart & Flutter по-русски
???????
Ну и в целом вывод пользователю строки даже звучит как UI)
Pavel Kozlovskiy
НУ в том же андроиде можно смапить коды ошибок в ResId, вот наверно почему у меня затык)
Dmitriy Orteney
ну передавай какой-то идентификатор, который использует библиотека для локализации
Pavel Kozlovskiy
Ну на самом деле, согласен ничего страшного нету, написать mixin mapFailureToStr и не париться
Max
Вся локализация - это отображение.
Sergey Hottabych
Сообщение об ошибке ты выводишь в UI. Значит, и разбор ошибок там же производишь. И валидация форм в UI.
Nikita Domnitskii
Валидация как-раз в бизнес логике
Sergey Hottabych
Да? Я обычно форму выношу в отдельный виджет, и прямо там
Sergey Hottabych
Не очень вижу смысл выносить валидацию куда-то в отдельное место. Знание о том, валидна форма или нет, понадобится только в одном месте программы, и только один раз — при заполнении формы, хранить потом статус формы на протяжении всего жизненного цикла приложения не нужно. Поэтому вполне можно в Stateful Widget валидировать.
Max
О, валидации бывают очень разные)
Артем Зайцев
Всем привет, есть экран состоящий из Scaffold. Внутри appBar и body. Хочется в body детектировать изменения состояния appBar и перерисовывать body исходя из изменений. Возможно это? Или так себе паттерн?
Nikita Domnitskii
Ты эти данные потом где-то используешь так-то
Di
Добрый день, как можно в зависимости от конфига подтягивать зависимости в пабсек?
Max
Кажется, это называется State Management)
Vladimir Avramov
Кстати, хороший вопрос. В dart 2.2 никаких возможностей условного подключения зависимостей не было. Пришлось делать файл-шаблон pubspec и делать препроцессниг его перед сборкой проекта. Я так понимаю, что в 2.8 версии ничего не изменилось и это единственный способ.
Di
А можешь рассказать/подкинуть статью на реализацию такого подхода?
Evgeny Cherkasov
Состояние аппбар каким образом меняется? Наверное более логично подписать и боди на источник этих изменений
Константин Буланов
[
"Коллеги а как правильно вызывать следующий экран из BlocBuilder? Обычный вызов \n",
{
"type": "pre",
"text": "Navigator.pushNamed(context, '/device');",
"language": ""
},
"\nприводит к такой ошибке."
]
Артем Зайцев
Внутри самого элемента body я понимаю как подписать на изменение какого-нибудь инпута, а как подписать body и appBar на что-то общее - нет. Меняется через setState(), но это не принципиально, можно переделать
Vladimir Avramov
[
"Статьи я не искал. Сделал свой ",
{
"type": "code",
"text": "pubspec.yaml.template"
},
". В нем указал ",
{
"type": "code",
"text": "@my_override_dep@"
},
". Далее в gradle через задачу ",
{
"type": "code",
"text": "ProcessResources"
},
" обрабатываешь файлик и делаешь уже pubspec.yaml из него. Но можно и сложнее через шаблонизатор типа усов и gradle-плагина для него сделать. Можно и через sh-скрипт сделать. Зависит от твоего сборщика."
]
Evgeny Cherkasov
Посмотрите Provider
Артем Зайцев
спасибо, гляну
Max
Не вызывать навигатор из билдера, вызывать его из обработчиков событий виджета?
Константин Буланов
Тогда не понимаю как мне сделать автоматический переход на другой экран при смене на нужное состояния в BLoC.
Nikita Domnitskii
Можно ридми флатер блока прочитать
Nikita Domnitskii
И не задавать глупые вопросы в чятике
Max
Есть грязный хак через Future.microtask. Но если к нему приходится прибегать - значит где-то архитектура недодумана.
Evgenii Elchev
BlockListener
Константин Буланов
Спасибо уже тоже допер, но в моем случае логичнее BlocConsumer походу.
Anatoly Politsin
[
"У меня нубский вопрос:\nсделал 2 функции \n",
{
"type": "code",
"text": "Future http() async {...}"
},
"\n",
{
"type": "code",
"text": "Future mqtt() async {...}"
},
"\n—\nкак мне сделать чтобы они работали вместе параллельно. Так не сработало ??:\n",
{
"type": "pre",
"text": "Future main() async {\n await http();\n await mqtt();\n}",
"language": ""
},
""
]
Константин Буланов
наверное через .then. Или организовывать STREAM и слушать его.
Max
Через then - это последовательно, а не параллельно
Anatoly Politsin
[
"А где про это почитать?\n",
{
"type": "link",
"text": "https://dart.dev/codelabs/async-await"
},
" - вот тут такие моменты не разбираются."
]
Anatoly Politsin
или какие-то примеры с гитхаба?
Evgeny Cherkasov
await убрать. но именно параллельно они все равно не будут работать )
Oleg Pchelkin
если ты пишешь await - ты ждешь окончания функции.
Anatoly Politsin
о! спасибо
Max
Почитать в спецификации объекта Future, глобальный метод wait
Anatoly Politsin
[
"без ",
{
"type": "code",
"text": "await'a"
},
" - достаточный уровень \"паралельности\" =)"
]
Oleg Pchelkin
там же в статье прям про await и async нормально описано
Max
Я написал сразу вслед за вопросом, полный, точный и окончательный ответ. В чём смысл последующего обсуждения?
Anatoly Politsin
да я просто 2й день с дартом и 1й день с "асинхронностью"
Max
В Dart предусмотрен специальный механизм для сформулированной тобой задачи.
Anatoly Politsin
[
"я не понял как сделать ",
{
"type": "code",
"text": "Future.wait()"
},
" - к чему это применить. Быстро погуглил про ",
{
"type": "code",
"text": "wait"
},
" и проще не стало"
]
Evgeny Cherkasov
В вопросе не было задачи дождаться результата выполнения обеих асинхронных функций
Oleg Pchelkin
wait нужен когда ты ждешь результата выполнения твоих асинхронных методов чтобы что то сделать с ним (например получить часть данных из локальной БД и часть с веба и потом их как то смержить). Но в твоем случае смысла нет в wait никакого
Alexander Vinogradov
«Чё почитать»
Alexander Vinogradov
[
"Недавно состоялся релиз новых мобильных приложений ",
{
"type": "text_link",
"text": "«Медузы»",
"href": "https://t.me/meduzalive"
},
".\n\nПочему на их переписывание понадобилось 2 года? Почему выбрали Flutter, а не нативные приложения? Оправдал ли в итоге Flutter надежды?\n\nОбо всё подробно рассказал техдир «Медузы»: ",
{
"type": "link",
"text": "https://tprg.ru/FrR3"
},
"\n\n",
{
"type": "hashtag",
"text": "#mobile"
},
" ",
{
"type": "hashtag",
"text": "#flutter"
},
""
]
???????
[
{
"type": "link",
"text": "https://t.me/rudart/200151"
},
"\n\nПравильно тебе сказал именно Макс"
]
Alexander Vinogradov
Аккордеон)
Павел
Ваше мнение, насколько надежны пуши? С какой вероятностью доходят?
Evgeny Cherkasov
Доходят, но 100% гарантии не дается
Павел
думаю на них положится и раз в день полить бэк
Max
В приведённом примере кода оборачивающая функция должа была вернуть какой-то результат после завершения обеих асинхронных функций внутри. Это именно та задача, которую выполняет Future.wait. Пожалуйста, если отвечаете на вопросы, в которых не являетесь специалистом, не будьте категоричны в ответах?
Oleg Pchelkin
Какой результат вернет Future ?
Evgeny Cherkasov
у меня точной статистики нет, но однозначно не 60%, я бы наверное процентов на 95 бы рассчитывал
Oleg Pchelkin
Это риторический вопрос Максу)
Max
И тем не менее, на него дан почти точный ответ.
Evgenii Elchev
от условий зависит
Dmitriy Orteney
на андроиде редко используемое приложение может лишиться привилегии получать пуши)
Evgenii Elchev
был добклад от яндекс почты, они жаловались на высокий процент потерь
Oleg Pchelkin
Ну так а что ты собрался делать с этим результатом?
???????
Наврал я, думал отдаст налл.
Oleg Pchelkin
он вернет ничего
Max
Void почти эквивалентен null. Разница только в том, что его нельзя читать.
Павел
значит все таки поллинг сервера лучше идея
???????
Ну да, я всеже чот думал, что будет именно null типа Null, если попробывать получить результат
???????
Не знаю почему так казалось)
Fearless Cry
в каком смысле нельзя читать?
Max
Есть два разных сценария - приложение активно (лучше всего вебсокеты) и приложение пассивно (нет вариантов, кроме Push)
Evgeny Cherkasov
Если по пушу что то критичное предполагается делать, то лучше конечно что то другое использовать
???????
Ну ты не можешь ничего делать с Void
Павел
я планирую раз в час-день поллить
Max
В смысле - использование значения типа Void является ошибкой типа.
???????
В дарте, вроде, это даже не тип, в отличии от Null
Fearless Cry
а проверка на тип вляется ошибкой типа?
Max
Проверка Void на тип - является.
Павел
именно думал повесить критичное и продублировать раз в день поллинг, но теперь думаю все таки заводить на бэке журнал операций и отдавать изменения
Дмитрий Коноферчук
а что в комментариях на дарт пате пишет?
???????
Описание типа Налл вот
Oleg Pchelkin
У меня норм
Дмитрий Коноферчук
[
{
"type": "link",
"text": "https://dartpad.dev/"
}
]
???????
[
{
"type": "pre",
"text": "Undefined name 'Void'.\nTry correcting the name to one that is defined, or defining the name.dartundefined_identifier",
"language": ""
}
]
Oleg Pchelkin
хотя тут смотря какой Void брать
???????
Ctrl+Click сделай по Void
Oleg Pchelkin
Подтянулся из native C (dart.ffi)
Дмитрий Коноферчук
Error: Getter not found: 'Void'. var v = Void; ^^^^
Fearless Cry
да даже a is Void нельзя сделать
Max
[
{
"type": "link",
"text": "https://medium.com/dartlang/dart-2-legacy-of-the-void-e7afb5f44df0"
},
" - всем заинтересованным судьбой Void)"
]
???????
В общем он единственный не происходит от Object.
???????
И его вообще никак нельзя использовать как объект.
???????
Ну в принципе логично, в том его и отличие от null.
???????
Эти ограничения, как я понял, накладывает сам SDK и у нас к этому доступа просто нет.
Nikita Domnitskii
налл это вообще пустое множество из теории категорий
Max
Но прекрасно можно укладывать во Future и Stream при этом)
???????
null это единственный экземпляр класса Null
Nikita Domnitskii
как это противоречит тому что я сказал?
???????
Напрямую: ты вне контекста обсуждения
???????
это совершенно другой уровень абстракции
Nikita Domnitskii
() это единственный экземпляр Unit
???????
Именно. А что такое void?)
Max
null - это тип данных в Dart, с единственным значением null. В контексте данного обсуждения.
Nikita Domnitskii
отсутствие типа???>?
???????
Также как null не отсутсвие значения)
???????
null это экземпляр класса Null
???????
[
{
"type": "pre",
"text": "A void type is semantically similar to Object(it could be anything), except with additional restrictions — a void type cannot be used for anything (even == or hashCode), and it is invalid to assign something to a void type",
"language": ""
},
""
]
???????
По сути это злой брат близнец Object'а
???????
Они оба обощают все.
Fearless Cry
войд это одновременно всё и ничего
Max
[
"Возвращаясь к исходному обсуждению - то, что тебе нужно, выглядит так:\n\n",
{
"type": "pre",
"text": "Future main() => Future.wait([http(), mqtt()]);",
"language": ""
},
""
]
Anatoly Politsin
Спасибо! Так понятнее
Fearless Cry
а почему исходный вариант не работает
Fearless Cry
он же игнорирует результаты то есть возвращает void
Max
Работает, но последовательно, а не параллельно.
Fearless Cry
а, в этом проблема
Max
Теперь понятнее, что я собрался делать с результатом?
Oleg Pchelkin
Все еще не вижу никаких проблем запускать это без wait, никакой информации о том, что нужно зачем то ожидать результат. Я не говорил что так не нужно делать - просто в рамках поставленного вопроса непонятно зачем
???????
Максим полностью прав
???????
К тому же такая запись офигенно красива и емка
???????
И она требуется почти везде
???????
Например в dispose твоего стейтфул виджета.
Oleg Pchelkin
Ко второму аргументу вопросов нет, но обоснование правоты просто тем, что так можно - не обоснование)
Max
В предложенной сигнатуре "сборная" фунция возвращает Future. Предложи другой способ получить значение для этого Future.
Oleg Pchelkin
ты имеешь ввиду, что без wait не запустится сама функция?
Max
[
"Я имею в виду, что без Wait ты не узнаешь, когда закончатся ",
{
"type": "bold",
"text": "оба"
},
" запущеных процесса."
]
???????
Допустим ты хочешь скачать N файлов, как ты будешь это делать?
Fearless Cry
ну иногда не важен результат, а важен факт выполнения
Oleg Pchelkin
в вопросе ничего не было про то, что нужно зачем то ожидать их окончания
???????
Лол, ожидать их явно надо)
Max
...кроме возвращаемого типа у функции main()
Nikita Domnitskii
Ну вообщем это кастрированный Unit/Null
Oleg Pchelkin
который тоже null
Oleg Pchelkin
ну точнее Future
Max
Ты не видишь разницы?
Oleg Pchelkin
иногда важен, иногда не важен
???????
[
"Что вернет:\n",
{
"type": "pre",
"text": " print(null is Object);\n print(Null is Object);",
"language": ""
},
"\n?"
]
Fearless Cry
и то и то true поди
Nikita Domnitskii
true, false
???????
Ну ты то отличник и на первой парте)
???????
И то и то наследуется от Object
???????
Вообще все наследуется от Object
Nikita Domnitskii
А, я думал тип это что-то отдельное всё таки
???????
И да, даже типы наследуются от Object
Nikita Domnitskii
Ну ладно
???????
[
{
"type": "code",
"text": "print(Type is Object);"
}
]
???????
Даже тип типов наследуется от обжект)
Fearless Cry
гораздо прикольнее вот такие штуки спрашивать: String a; print(a is String);
Oleg Pchelkin
я вижу разницу, но все еще не вижу причин ожидать результата, если это не описано в задаче) Придумывать смысл неописанной задаче - как придумывать смысл цвету штор в произведениях Пушкина. Я не вижу смысл разводить холивар - если нужно ждать результата - то используй wait, если нет - запускай без него)
Fearless Cry
возможно ты перепутал чёто
Fearless Cry
мы эти штуки полгода назад ещё обсуждали
4??uzhoy .
че за фигня, почему false?
Fearless Cry
null is Null -> true
Nikita Domnitskii
Ненадолго
Fearless Cry
чё, дартпад запустил?)
Nikita Domnitskii
Ну я вообще так и думал
Nikita Domnitskii
Проверил просто
Fearless Cry
“да я знал просто проверил"
Nikita Domnitskii
В другой чат иди выёбываться(((
???????
потому что не проинициализировав объект в нем находится не экземпляр этого типа, а объект null типа Null)
Fearless Cry
ты чё сообщения потёр гад
???????
Ты наябедничаешь)
Fearless Cry
а мы оба знаем этого человека да?
Fearless Cry
пошёл шеймить
???????
[
"Вот так, мб, чот прояснит)\n\n",
{
"type": "pre",
"text": "void main() {\n String s;\n print(s is Null);\n}",
"language": ""
},
""
]
4??uzhoy .
да я понял уже, посмотрел тип, он вернул Null
???????
Нинад, тем более он мне там помочь хотел. Эт у меня язык без костей.
Pavel Kozlovskiy
Подскажите, а можно вставить "цепочку" роутов в навигаторе, похоже что нет.
???????
Ты можешь реализовать роутер так тонко как только хочешь
Pavel Kozlovskiy
Мне после экрана создания сущности, надо открыть экрана создания "подсущностей" этой сущности, но так чтобы при уходе с него открылся экран информации "сущности"(а не экран списка сущностей с которого изначально вызвали)
Cole
[
"почему textfield открывает огромную белую простыню когда получает фокус? ",
{
"type": "link",
"text": "https://i.gyazo.com/29a5eb8d46d7b1fdbb23a929eb005e78.mp4"
},
""
]
|