Программирование : Dart & Flutter по-русски
Renad ??.
Как называется этот список
Виктор
Всем привет ?? Вопрос о тестировании. Есть кто то, кто использует flutter_driver в CI для интеграционных тестов?
vasilich
[
{
"type": "link",
"text": "https://nometa.xyz/"
},
"\n\nЭтот очень распространенная фича, и думаю здесь большинство с ней работали."
]
Renad ??.
Вы знаете ее имя по-английски?
vasilich
Code completion, auto complete dropdown
Виктор
спасибо, переформулирую ??
Виктор
В данный момент наша команда разрабатывает приложение на подобие тиндер с использованием flutter. Разработчики пишут widget тесты, но все таки по хорошему нужны и интеграционные тесты (e2e) Я достаточно много времени потратил на решение проблем по взаимодействию с некоторыми контролами, к примеру image_picker, image_cropper которые в итоге по сути мокаются и не тестируются. Встретился с кучей ограничений, к примеру отсутствием test coverage. И в итоге нашел так же сообщение от разработчика о том, что в планах уход от разработки flutter_driver и расширение flutter_test для работы с реальными девайсами. В итоге вопрос, стоит ли в принципе вкладывать сейчас время в flutter_driver и есть ли другие способы, позволяющие автоматизировать e2e для flutter?
Mikhail Smetannikov
я не нашел, мучаюсь
Sergey Hottabych
А как работает Get.create + GetWidget? Я так понял, что это для списков, где у каждого элемента свой контроллер. Они по умолчанию persistent, что логично — когда список их скрывает, контроллеры не удаляются. А GetWidget позволяет запомнить ссылку на нужный контроллер. Но вот только вопрос — что же, они вечно висят в памяти, засоряя её? Если список на 10 000 элементов?
Виктор
эх. крепитесь) спасибо за фидбек!
Sergey Hottabych
Ну flutter_driver — это боль. Очень бедное апи по сравнению с юнит- и виджет-тестами. Придется все виджеты увешивать ключами и определять их по ключам. Каждый раз запускать на реальном девайсе, ждать, пока установится, мгновенно прогонится, и тут же вырубится. При этом польза их непонятна, ведь виджет-тесты делают то же самое — имитируют кусочек приложения, только спавнят его мгновенно, в тестовом окружении, не надо ждать установки.
Виктор
Спасибо, Сергей! То есть вы ограничиваетесь widget tests и проводите e2e мануально?
Sergey Hottabych
[
"Можете посмотреть в сторону ",
{
"type": "link",
"text": "21labs.io"
},
""
]
Sergey Hottabych
Это платное решение для е2е тестирования приложений на Флаттере
Sergey Hottabych
Для тестировщиков, без знаний flutter_driver
Виктор
Большое спасибо, обязательно ??
Sergey Hottabych
Просто в визуальном редакторе прокликиваете приложение, сохраняете макрос, и он его воспроизводит.
Виктор
Да, как раз тыкаю их сайт. Спасибо за наводку, возможно и правда хорошая альтернатива
Sergey Hottabych
Ну это вроде как единственные ребята, которые поддерживают Флаттер. Мы с ними созванивались, они заверяют, что у них все работает. У них не только парсинг дерева виджетов, но еще и визуальное распознавание.
Sergey Hottabych
Ну у нас маленькая команда была, всего 3 человека. Тестировщиков не было. Сами пишем, сами тестируем.
Виктор
Спасибо за Ваше время и фидбек. У нас тоже небольшая команда на данном этапе, но планируется расширение и сейчас пытаемся понять как лучше организовать этот процесс, чтоб было что то более менее серьезное
Sergey Hottabych
А я сейчас в поиске как раз. Мы тот проект завершили буквально на днях, команду распустили. Так что если нужны будут разработчики, обращайтесь.
Dmitry Bubnenkov
[
"По прежнему туплю с провайдером.\nВот у меня модель есть class Stat { ... } \n\nПолучается я должен создать класс который:\n",
{
"type": "pre",
"text": "StatProvider extends ChangeNotifier { }\n",
"language": ""
},
"\n верно?\n\nНо если я в нем полем сделаю: \n",
{
"type": "pre",
"text": "Stat stat = Stat();",
"language": ""
},
"\nТо в какой момент заполнять его? В конструктор Stat же данные нужно передавать, а в момент определения внутри провайдера там данных не будет"
]
Виктор
Окей. Буду иметь ввиду ?? Если нас не распустят за неимением решения процесса е2е ??
Dmitry Bubnenkov
Или мне потом в момент получения данных именно экземляр класса Stat который внутри провайдера и заполнять?
Damir
[
"Могли бы подсказать, почему не получается при вводе телефона сделать видимым поле пароля?\n",
{
"type": "link",
"text": "https://gist.github.com/damirtokmashov/6f8ee4bed1f93dee0463ea3c6b961a31"
},
""
]
Sergey Hottabych
Нет, ты должен создать Stat extends ChangeNotifier А потом засунуть его в провайдер через ChangeNotifierProvider(builder: (_) => Stat()) и тогда виджеты ниже по дереву получат возможность читать его и получать изменения.
Sergey Hottabych
может, не builder, не помню точно но смысл такой
Dmitry Bubnenkov
Прям в модели данных получается?
Dmitry Bubnenkov
[
"т.е. модель данных должна быть описана как:\n",
{
"type": "code",
"text": "Stat extends ChangeNotifier"
},
""
]
Sergey Hottabych
А, у тебя Stat — это модель?
Dmitry Bubnenkov
[
{
"type": "pre",
"text": "class Stat {\nString name;\nint age;\n}",
"language": ""
},
"\n\nИх я получаю из get запроса"
]
Sergey Hottabych
Тогда создай только не StatProvider, а StatStore назови. В нем будет List stats, методы CRUD. И запихнуть его в ChangeNotifierProvider
Sergey Hottabych
Это вас Максимиллиан с толку сбивает. Провайдер, это штука, которая выставляет класс для чтения дочерними виджетами, а не сам класс с бизнес-логикой. Класс лучше назвать Store.
Dmitry Bubnenkov
А в иерархии каталогов куда его поместить? Я про Store
Sergey Hottabych
Я называю каталог stores
Nataly Siberia
Всем добрый день! подскажите пожалуйста какой лучше всего использовать платежный сервис на flutter?
Sergey Hottabych
Мне вообще говорили, что лучше делать платежи на сервере, и обращаться к нему через Rest. Как минимум, есть 2 сервиса — Stripe и Cloudpayments, надо поддерживать оба, у Cloudpayments, к тому же, нет API под Flutter.
Dmitry Bubnenkov
А в каких случаях нужно было StatProvider создать?
Sergey Hottabych
Он папку называет providers, но это не совсем корректно. Так как это не провайдеры, а "провайдируемые" классы.
Nataly Siberia
stripe в россии разве работает? вроде он не поддерживается...
Sergey Hottabych
Stripe — Европа, Cloudpayments — Россия
Dmitry Bubnenkov
Получается модель просто описание т.е. класс А Store — хранит набор моделей и к нему мы доступ получаем через провайдер, верно?
Dmitry Bubnenkov
И дальше получается мы обращаясь через http заполняем модель описанную в Store и потом обращаемся к ней через провайдер там где ее отобразить надо, так?
Sergey Hottabych
[
"ChangeNotifierProvider подвешиваем у корня приложения (оборачиваем MaterialApp в него)\nСчитываем ниже по дереву через ",
{
"type": "link",
"text": "context.read/watch/select"
},
" или через Consumer/Selector"
]
Sergey Hottabych
А так все правильно.
Sergey Hottabych
В Store метод fetchStats(), который делает запрос к http.
Zarobsho Nuridinov
привет всем
Zarobsho Nuridinov
помогите настроить flutter
Alex Wow
вроде нет явы пишет
Zarobsho Nuridinov
суть в том чтобы без андроид студио работать с флаттером на вс коде
Alex Wow
андроид студию установи
Alex Wow
и всё подтянется
Дима
[
{
"type": "link",
"text": "https://www.oracle.com/ru/java/technologies/javase-jdk15-downloads.html"
}
]
Sergey Miroshin
уже 15 jdk вышла? ого
H K
ustonavite Java 8. u menya tak rabotal
Damir
Подскажите неточность :)
Алексей
ребят, подскажите, как в Dart динамически получить доступ к полю объекта. на картинке пример решения задачи на JS
Andrey
[
"если объект типа ",
{
"type": "code",
"text": "Map "
},
", то по нему можно пройтись циклом точно так же как в JS"
]
Timur Karimov
так делать нельзя а для чего это?
Dmitry Bubnenkov
[
"А что тогда в иерархии принято в Services класть? Если в Store у меня будет \n\n",
{
"type": "pre",
"text": "class SectionsStatStore extends ChangeNotifier {\n late SectionsDBStat sectionsDBStat;\n\n MethodThatExtractDataFromHTTPAndFillsectionsDBStat() {\n \n }\n}",
"language": ""
},
""
]
Алексей
есть объект, мне надо выдернуть у него несколько полей. если названия этих полей внести в массив строк, то потом в цикле можно перебирать нужные поля
Dmitry Bubnenkov
типа такого должно получиться?
Sergey Hottabych
Типа такого, но бросание необрабатываемого исключения — это плохой стиль.
Sergey Hottabych
А обрабатывать его кто будет?! Дядя Вася? Тётя Паша?!
Dmitry Bubnenkov
А как правильнее сделать?
Dmitry Bubnenkov
И момент заполнения данными sectionsDBStat как реализовать? Метод получения должен это поле внутри себя заполнять?
Sergey Hottabych
запрос обернуть в try-catch в catch просто выводить респонс в консоль через print
Sergey Hottabych
про throw забыть
Dmitry Bubnenkov
ок спасибо
Sergey Hottabych
я не знаю, что у тебя такое "Stat" и что такое "section" так что подсказать вряд ли смогу
AL
Подскажите, как загружать на фоне сразу несколько ссылок
Dmitry Bubnenkov
да там просто поля поле1 поле2 поле3
Sergey Hottabych
но судя по тому, что у тебя написано SectionDbStat.fromJson(), он на этом месте уже и заполнился
Sergey Hottabych
какого ты еще заполнения хочешь, я не знаю
Dmitry Bubnenkov
Или еще один метод нужно сделать который бы дергал заполнение данных типа:
Dmitry Bubnenkov
не, он то заполняет данные, но return то в какой-то момент нужно делать
Dmitry Bubnenkov
Как я на скрине выше
Sergey Hottabych
Ну то есть, ты просто копипастишь код откуда-то без понимания?
Dmitry Bubnenkov
нет, я его пишу и пытаюсь как раз разобраться
Dmitry Bubnenkov
просто не так же мне делать?
Sergey Hottabych
Именно так.
Sergey Hottabych
Ты член класса заполняешь данными. return ничего не возвращает
Sergey Hottabych
У тебя возвращаемый тип Future
Sergey Hottabych
после вот этой строчки напиши просто return;
Dmitry Bubnenkov
угу, спасибо, понял
Dmitry Bubnenkov
а зачем return? вроде бы метод и так завершится
Dmitry Bubnenkov
А ты еще выше сказал, что Максимилиан Store называет провайдером. Это получается автор самого провайдера нейминг не уместный дает?
Sergey Hottabych
Можно даже без return, да.
Sergey Hottabych
Максимиллиан не автор провайдера. Да, он неуместный нейминг даёт.
Sergey Hottabych
Автор провайдера — Remi Rousellet
Sergey Hottabych
А еще лучше взять Dio. Он будет и jsonDecode сам делать, и statusCode чекать
Sergey Hottabych
вместо http
Dmitry Bubnenkov
угу, спасибо за совета. А там по дефолту тайминг на запросы ставится? Просто тут два часа не мог понять что не так. Окзываается таймаут нужно указывать руками
Dmitry Bubnenkov
Просто какой-то чел кто про провайдер видео много снял?
Sergey Hottabych
Он не какой-то чел, он вообще крутой и известный препод по всяким веб-технологиям, у него школа Academind. Но у него тоже могут быть неточности.
Dmitry Bubnenkov
я правильно понимаю что late нужно использовать, когда я 100% уверен что данные будут, но позже?
Роман Оболонский
Коллеги, доброе утро Такой вопрос. Хотел хочу взять себе МакБук с новым чипом, М1 который. Не знаете, не будет ли каких-то проблем для кодинга под Андроид? И правильно ли я понимаю что про x86 можно будет забыть?
Dmitry Bubnenkov
[
{
"type": "mention",
"text": "@Hottabych"
},
" и еще вопрос — если мне нужно одно единственное поле где-то использовать. Мне под него так же модель нужно и ее в Store?"
]
Sergey Hottabych
Да, и кстати, late тут не подойдет, т.к. данные могут и не прийти. Его стоит сделать nullable
Sergey Hottabych
Если одно поле — одно поле и клади в Store, зачем ненужные обертки.
Роман Оболонский
Ребята, есть здесь пользователи новых маков с чипом М1? Думаю о покупке, хочу задать несколько вопросов)
Dmitry Bubnenkov
слушай, а в самом виджете то у меня теперь эта статистика не как Future будет. Получается мне вместо FutureBuilder нужно просто Builder использовать?
Дима
воспользуйтесь поиском по чату там есть ответы
Robert Smith
ребят, кто нить может вкратце рассказать про навигацию? я как понял способов много вплоть до сторонних либ, какую советуете использовать?
Sergey Hottabych
Вот ты и столкнулся с одним из недостатков чистого провайдера. Ты Future никак не можешь запихнуть в Store и отследить его состояние. И тут настало время смотреть в сторону MobX, где есть ObservableFuture, (или Get и StateMixin).
Dmitry Bubnenkov
А в каких проектах тогда хорош провайдер?
Dmitry Bubnenkov
Если его использование так лимитировано?
Sergey Hottabych
В проектах уровня Hello World.
Sergey Hottabych
Ну MobX тоже использует Provider, но без ChangeNotifier. У него свой формат стора. Provider чисто для доставки.
Dmitry Bubnenkov
И все? Т.е. реально им никто не пользуется?
Sergey Hottabych
Я от ChangeNotifier отказался уже давно.
Дмитрий Мезенцев
Есть ли способ выборки ссылки из текстового виджета?
Роман Оболонский
Окей, сейчас гляну)
Sergey Hottabych
Кстати, моя неточность — http, там да, надо проверять statusCode. У тебя правильно было. Это в Dio нужно в try-catch оборачивать, так как он сам проверяет statusCode, и если >300, то кидает DioError. Но в остальном верно, в случае ошибки (в else или в catch), нужно просто выводить лог, не надо throw
Noob Noobskiy
День добрый?????>? Почему так не работает? Как можно сделать, чтобы при тапе каждый раз значение увеличивалось. _counter++ работает, а +10 уже нет
Олжас Сулеймен
+=10, учи язык
Noob Noobskiy
Спасибо. Учу потихоньку)
Noob Noobskiy
Спасибо, сделал)
Dmitry Bubnenkov
Без него ругалось на нул-сейфити
Arslan
Оу, оу, оу. По легче
Arslan
Ты конкретно про него как будто написал
Dima Kotlyarov
печально что в разработке есть такие негативные обезьяны у которых с чсв проблемы - унижение джунов проповедуют
Dima Kotlyarov
да - такое програмирование нам не нужно(
Sergey Hottabych
Мне потом за такими программистами проекты переделывать. Когда огромные завалы кода сделаны на одном setState, без какого-либо понятия об архитектуре.
Дмитрий Щербаков
Все сразу сеньорами начинали ??
Dima Kotlyarov
вот им и говори) а пока ты только что оскорбил явно человека - новичка который видимо не совсем разобрался с операторами)
Sergey Hottabych
Ну так ему надо не с Флаттера начинать, а с консольных приложений.
Dima Kotlyarov
мне если честно даже стыдно стало за тебя( а с чего ты взял что ты истина последней инстанции? человек не знаком с синтаксисом (в данном примере оператором присваивания) и теперь - ты грустишь что тебя окружают такие непрофессионалы(
Dima Kotlyarov
это низко - как минимум) чат посвящен разработке на флаттер! независимо - сеньер ты или джун! люди делатся ОПЫТОМ ) у когото больше у когото меньше
Damir
Почему в вашем описании профиля просьба писать в общий чат, а потом возмущаться?)
Dima Kotlyarov
чсв зашкаливает)) типа все ему пишут))) хаха
Sergey Hottabych
Это для индусов
Sergey Hottabych
индусы из англ. чатика реально задалбывают в личку
Ivan
а что не так с setState? ??
Станислав Ксенофонтов
[
"Сергей, почитайте правила сообщества ",
{
"type": "link",
"text": "https://github.com/rudart/community/blob/master/chat_rules.md"
},
""
]
Dmitry Belyaev
[
{
"type": "link",
"text": "https://t.me/joinchat/E4cj8uH1PZPxQmUA"
}
]
Sergey Hottabych
Ладно, всё, всем мир. Извините, если кто себя посчитал оскорбленным. День был тяжелый.
Dima Kotlyarov
проблемы будут с производительностью и поддерживаемостью кода) setState базовая модель скажем так! для реальных проеков требуется другие архитектурные подходы для того что бы код был удобным в поодержке и для повыешния производительныости
Sergey Hottabych
По-простому: в одном месте поменял — в 10 других отвалилось.
Arslan
Да всё ок) доброго дня
Vladislav [object Object]
А причем тут флаттер?)
Damir
Пока движ, могли бы подсказать как отобразить текстовое поле скрытое?
Vladislav [object Object]
Ой, сорри, не на то сообщение ответил
Damir
Специально все упростил, чтобы через setState отображалось
Maks Kravchenko
читайте правила чата и создавайте нормальное комьюнити
Dima Kotlyarov
Ты меня просто в тупик поставил )))))
Andy Andy
А что за чатик, скинь ссылку пожалуйста
Sergey Hottabych
Я никого конкретно не оскорблял. Я посетовал на низкий уровень сообщества (некоторых отдельных его членов).
Sergey Hottabych
Так, покажи, кого я назвал бастардом и мудаком? Не было такого.
Sergey Hottabych
Я говорю, что скоро скатимся до уровня индусского чата с вопросами: "Почему не работает код counter+10;"
Dima Kotlyarov
Ты назвал человека обезьяной . В данном контексте это более чем оскорбление)
Dima Kotlyarov
Мы не провалимся , не переживай
Vladislav [object Object]
Чтобы таких обезьян не брали на работу есть собеседования и все зависит от компании
Maks Kravchenko
[
"у человека на скрине ",
{
"type": "code",
"text": "counter += 10"
},
"\n\nцитирую ваш ответ ",
{
"type": "code",
"text": "порог вхождения снизился настолько, что программирование стало доступно для обезьян, которые пишут counter+10"
},
"\nдостаточно направленный комментарий"
]
Maks Kravchenko
День добрый?????>? Почему так не работает? Как можно сделать, чтобы при тапе каждый раз значение увеличивалось. _counter++ работает, а +10 уже нет
Maks Kravchenko
Печально, конечно. С такими фреймворками как Флаттер, порог вхождения снизился настолько, что программирование стало доступно для обезьян, которые пишут counter+10. Их еще и на работу умудряются брать.
Ivan
Кота позовите, пусть он вас рассудит
Vladislav [object Object]
Ну и что, задал человек вопрос, Вы когда начинали таких глупых и тупых вопросов не задавали?
Sergey Hottabych
До такой степени — нет.
Maks Kravchenko
[
{
"type": "mention",
"text": "@bunopus"
}
]
Sergey Hottabych
Обезьяна — это не оскорбление. Это животное.
Dima Kotlyarov
Может тебе пора в другой чат ? Там где профи ?
Vladislav [object Object]
Гений мысли
Noob Noobskiy
Да забейте, я зла на него не держу ??
Maksim Gridin
Согласно Дарвину - наш общий предок, между прочим! ))
Vladislav [object Object]
Если уж не хочешь ортвечать на глупый вопрос, игнорь просто
Maksim Gridin
А тебе конечно следует хотя бы синтаксис языка подучить, прежде чем вопросы в чат задавать
Vladislav [object Object]
Все мы разные и каждому программирование дается/давалось по разному
Evgeny Kot
[
{
"type": "mention",
"text": "@Hottabych"
},
" ты зачем людей оскорбляешь"
]
Олжас Сулеймен
все сводится к setState, прямо или косвенно
Maks Kravchenko
то, что Вы на него зла не держите, не значит что это норма пусть это и не мой чат, но я за здоровое комьюнити, где люди после подобного не будут бояться задавать “глупые” вопросы
Sergey Hottabych
Я извинился же.
Vladislav [object Object]
Объективно, у нас самый адекватный чат еще
Vladislav [object Object]
из всех других технологий, которых я видел
Noob Noobskiy
Учил, забыл. Думаю немного практики, и со временем запомнится)
Evgeny Kot
Добрее надо быть, друзья
Vladislav [object Object]
Таки будет, главное не бояться трудностей
Sergey Hottabych
[
"Я думаю, у тебя есть все шансы стать неплохим программистом, просто не лезь сразу в сложные вещи.\nНачни с ",
{
"type": "link",
"text": "https://dart.dev/guides/language/language-tour"
},
""
]
Ivan
вот вот, можно прекрасно все написать не используя стейт менеджеры )
Vladislav [object Object]
на ванильном стейт-менеджере флаттера далеко не уедешь
Vladislav [object Object]
Простые приложения ок, но когда понадобиться разделять бизнес логику и ui будут проблемы
Vladislav [object Object]
Простые - на уровне читалки или работы с каким-то апи погоды
Олжас Сулеймен
а какой там стейт менеджер?
Vladislav [object Object]
Да и вообще что плохого в стейт-менеджерах?
Ivan
да я просто написал, там в посте на который ты ответил, думаю это подразумевалось
Олжас Сулеймен
я ничего против не имею но все эти стейт менеджеры не явно дергают setState у State'a или markNeedsBuild если нет State'a
Andrey
подскажите пожалуйста как локализовать запросы ios на получение разрешений
Andrey
а то пока не хочется углубляться в ios натив
Vladislav [object Object]
в info.plist это задается и локализуется нативно
Vladislav [object Object]
Была такая же проблема, пришлось в натив лесть
Andrey
ну, допустим, название приложения у меня локализовать получилось, а как прописать в info.plist локализованные строки?)
Vladislav [object Object]
[
{
"type": "link",
"text": "https://medium.com/@guerrix/info-plist-localization-ad5daaea732a"
}
]
Andrey
да это понятно, сюда как это подставить?
Ivan
ну второе это уже извращение имхо, зачем грохать виджет если есть стейт специально для этого )
Nikita
Добрый день, не подскажете виджеты для работы с просмотром изображений(как в тг например). Нашёл interactiveviewer, но пока не устраивает. Может есть какие-то аналоги?
Andrey
[
"я понял, оно просто игнорит значения из ",
{
"type": "code",
"text": "Info.plist"
},
" если оно есть в ",
{
"type": "code",
"text": "InfoPlist.strings"
},
""
]
|