Программирование : Dart & Flutter по-русски
???????
Ага, ток на "упрощенный" особо не налегай, если у вас тама не супер .net разработчики)
Fanis Sagdeev
Привет всем! Ребят подскажите пожалуйста. У меня есть опыт говнокодинга на php ну и javascript с jquery. Интересна мобильная разработка. Начал рыскать по инету наткнулся на конференции по флаттер. И давай штудировать информацию. Первое впечатление это восторг. Но так как нет опыта в мобилках я так понимаю будет сложно сразу начинать с изучения Дарта и флаттер? Подскажите пожалуйста. Можно ли начинать с дарт и флаттер, или лучше начать с чего то нативного по типу swift или kotlin для андроид?
Fanis Sagdeev
Спасибо за ответ, но натыкаюсь на статьи разного рода, где пишут, что в любом случае придется сталкиваться с нативной разработкой.
DVS (Read The F.ng Manual) Studio (NoHello)
а для оставшихся 0,005% есть инструкции
Fanis Sagdeev
Я вас понял, наверное вы правы начну сразу с дарт, я давно так увлеченно до пяти утра не искал информацию.
Джафар Исхоков
Если ты хочешь делать UI с логикой и хранениями данных, то можешь не изучать нативку. Но если тебе понадобится либа, которая есть только под нативки и нет плагина под них, то готовься писать код под каждую платформу отдельно. Пример популярного плагина, который под капотом использует написаный код под нативку, это google map под flutter. Подведя итоги могу сказать, что в большинстве проектов однотипные задания, которые уже решены либо разрабами flutter, либо сообществом.
???????
Утраиваю, не заморачивайся с нативом. К томуже флатер это не только про мобилки. А то таким макаром пойдешь учить котлин, свифт, жс, плюсы, сисярп и бог еще знает что)
Fanis Sagdeev
Спасибо за ответы!
Aleksey
Я бы добавил что натив надо изучить на уровне скомпилить готовый проект, поменять что-то в конфигах, название, иконку, версии SDK и тд.
Gabben
Да достаточно одни плюсы)
Farid
пока флаттер только под мобилки, всё остальное в адовой пре-альфе находится
Farid
к тому, что говорить, мол, флаттер не только под мобилки - слегка не договаривать о том, что написал выше
???????
Готовлю на нем веб, полет нормальный
Fanis Sagdeev
Да это по статьям я понял, натив необходим будет, его нужно так же изучить будет. Для меня важно было узнать не сделаю ли я себе хуже начав с изучения Дарт и flutter. Так как у меня есть плохой опыт в вебе. Я начал с фриланса созданием сайтов на CMS по типу вордпресса, опенкарта изучая PHP и JS, дергая готовые решения или создавая свои небольшие плагины. По JS основы я начал только недавно изучать с самого начала и стал понимать, что занимался до этого откровенно говоря говнокодом.
Fanis Sagdeev
У меня на счет этого незнаю почему, сложилось хорошее впечатление. Возможно из за того что я читал старые статьи где все в основном хаяли dart и flutter о его тормознутости, но по итогу время показало, Гугл выкатила отличный инструмент которым уже вовсю пользуются. Я думаю со временем они полноценно реализуют и веб.
Anton ?? ? ??
почему у меня запуск флаттера на устройстве падает на этом методе?
Anton ?? ? ??
вообще почему он может падать на этом методе
Artem Zaitsev
[
{
"type": "link",
"text": "https://twitter.com/FlutterDev/status/1137033935089807365?s=09"
}
]
Slava Marchenko
смотри выше по стеку
(;?_?) Ivan Zhuravlev ???>?
да ладно, он же не битрикс с маджентой ковырял
(;?_?) Ivan Zhuravlev ???>?
ну донность, имхо, всё же субъективна и зависит от того, кто код кодит. если его устраивает говнокод, то вот оно, дно. а если нет и он развивается и растет, то и пхп хороший язык
Anton Vasiljev
ща без пыщьпыщь продакшн девелопмента ни в одни сроки не уложишься
Anton Vasiljev
и время жизни продукта становится все короче
Sergey Bubnov
Привет всем. Как думаете, есть ли что-то такого в приложении телеграм, что нельзя сделать на флаттере без использования свифта или java ? У меня пока сомнения на счет загрузки файлов и показа индикатора и пушей, которые исчезают если просмотреть сообщение напрмер в вебе.
Джафар Исхоков
Телега реализованно под нативку, скорее всего там есть много всякой защиты, которую надо будет писать под нативку. К примеру встроенный впн клиент (точно не знаю есть ли это сейчас под флаттер). В целом можно написать такой же клиент под флаттер, но по поводу защиты у меня возникают много сомнений.
Sergey Bubnov
Я смотрел исходники андроида и там даже на плюсах чето написано у них. Возможно это как раз связано с защитой
Artyom Nesterenko
Привет. Да, например привязку к TDLib. С Dart/FFI можно будет пробовать. Там слишком много всего под капотом, но с точки зрения повторения UI, думаю, ничего невозможного для Flutter нет.
Sergiy Vergun
Всем привет, не могу установить flutter в vs code, может кто-то помочь?
Anton ?? ? ??
В чем проблема
Artyom Nesterenko
На плюсах вся TDLib.
Artyom Nesterenko
У них база приложения на C++, остальное на Java либо Swift.
Sergiy Vergun
Все плагины уже установил, сдк также, проект создал, но запустить на эмуляторе не могу
(;?_?) Ivan Zhuravlev ???>?
результат dir в студию
Artyom Nesterenko
Проект как создавали?
Sergey Bubnov
Допустим мы сможем обойтись обычный sqlite. Остальное вроде реализуемо? Кстати как у них вообще мессаги отправляются? Сокеты или лонгполинг? Вот мы сокетами балуемся, но хз насколько флаттер с ними дружит
(;?_?) Ivan Zhuravlev ???>?
так ты не из той папки запускаешь его
Sergiy Vergun
command palette -> FLutter: new project
Sergiy Vergun
Проект как создавали?
(;?_?) Ivan Zhuravlev ???>?
вот из new_project и делай flutter run
Sergiy Vergun
заметил, но все равно не запускается
(;?_?) Ivan Zhuravlev ???>?
ну а теперь следуй инструкциям
(;?_?) Ivan Zhuravlev ???>?
он тебе что пишет, то и делай
(;?_?) Ivan Zhuravlev ???>?
???>?
Sergiy Vergun
проблема с путем одним
Artyom Nesterenko
Обычный SQLite – это какой? Он же тоже нативный. Дальше у них используется BoringSSL, его тоже нужно скомпилить и сделать привязки к Dart. Вот так начинаешь копать, и одно цепляется за другое.
(;?_?) Ivan Zhuravlev ???>?
на вкус и цвет все фломастеры разные ???>?
Artyom Nesterenko
Вот весь их натив (без TDLib). Теперь можете прикинуть, что возможно, а что нет.
Artyom Nesterenko
Причем там форки с оптимизациями.
Anton ?? ? ??
libtgvoip на плюсах
Artyom Nesterenko
Например, SQLite.
Artyom Nesterenko
Так а я о чем. Все эти библиотеки на C или C++.
Artyom Nesterenko
Те же звонки тоже без натива не сделать.
Sergey Bubnov
Спасибо. Лучше мне наверное попунктам накидать фичи которые нужны в нашем приложени и тогда уже сможем понять, стоит ли брать флаттер
Artyom Nesterenko
[
"Докопал сейчас от нажатия на кнопку \"Отправить\" до собственно отправки сообщения. Дальше не полез.\n",
{
"type": "link",
"text": "https://github.com/DrKLO/Telegram/blob/master/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java#L212"
},
""
]
Artyom Nesterenko
[
"Дальше только в C++ смотреть.\n",
{
"type": "pre",
"text": "public static native void native_sendRequest(int currentAccount, long object, RequestDelegateInternal onComplete, QuickAckDelegate onQuickAck, WriteToSocketDelegate onWriteToSocket, int flags, int datacenterId, int connetionType, boolean immediate, int requestToken);",
"language": ""
},
""
]
a d
Всем привет! подскажите пожалуйста, что лучше использовать для стора данных в flutter, если приложение работает с REST апи? Судя по примерам с ScopedModel при большом кол-ве данных, код быстро превратиться в лапшу. Вариант с BLOC выглядит красиво, но немогу понять как через стримы можно обновлять список данных после редактирования/удаления
DVS (Read The F.ng Manual) Studio (NoHello)
пинаешь блок, он yield-ит стейты, список, обернутый в BlocBuilder обновляется
Fanis Sagdeev
Соглашусь, есть разработчики которые делают хорошие продукты и поддерживают интересные проекты на ПХП. У меня же изначально горький опыт, так как я пошел неверным путем и начал с фриланса клипая сайты и плагины на заказ. В какой то момент понял что топчусь на месте...
Anton ?? ? ??
c флаттером особо много не изучишь
Anton ?? ? ??
Можно ли сохранить стейт экрана, чтобы он сохранился даже при закрытии приложения? и вообще как это сделать. Как юзкейс, я формирую ListView(), который должен меняться только при изменении, и никогда не сбрасываться.
(;?_?) Ivan Zhuravlev ???>?
храни в дб, при старте загружай из дб
Anton ?? ? ??
что использовать?
(;?_?) Ivan Zhuravlev ???>?
хочешь - sqlite, хочешь - firestore, хочешь - shared_preferences
(;?_?) Ivan Zhuravlev ???>?
как тебе удобно и требуется условиями работы приложения ???>?
Dmitry T.
[
"всем привет, кто знает что хрень?\nUbuntu, пытаюсь сделать flutter doctor (после ",
{
"type": "code",
"text": " export PATH=\"$PATH:[PATH_TO_FLUTTER_GIT_DIRECTORY]/flutter/bin\""
},
") и мне постоянно кидает такую ошибку\n",
{
"type": "code",
"text": "/usr/bin/env: ‘bash\\r’: No such file or directory"
},
"\nпричем даже если зайти в AS и сделать tools/flutter/flutter get packages - такая же ошибка только уже в консоли AS"
]
Dmitry T.
Сорри если я не по адресу, просто уже хз что делать, а хотел просто обновить flutter ( обновил (
Sunny
[
{
"type": "mention",
"text": "@torindev"
},
" sudo apt-get install dos2unix && dos2unix ",
{
"type": "code",
"text": "/flutter/bin"
},
"/flutter"
]
Dmitry T.
[
{
"type": "mention",
"text": "@TheYove"
},
" сорян, не пробовал твое решение, но на винде тоже проблемы, кажется гугл что-то сломал"
]
Dmitry T.
[
{
"type": "link",
"text": "https://github.com/flutter/flutter/issues/33938"
}
]
Dmitry T.
я хапанул самый последний апдейт, даже не помню что там было, метров на 13, псоле этого все пошло по... сломалось короче
Dmitry T.
лучше не ставте этот апдейт )
Sunny
Ну вообще то что я скинул, должно помочь
Dmitry T.
кстати работать перестал именно flutter, под андроид обычный проект на kotlin - все собралось
Dmitry T.
[
"если вдруг кто-то такой же неудачник как я, на винде фиксится вот этим - ",
{
"type": "link",
"text": "https://github.com/flutter/flutter/issues/33938#issuecomment-499255056"
},
""
]
admin
часто такое бывает в последнее время, приходиться вручную удалять
admin
чо пацаны, есть тут кто с опытом 3 года
Dmitry T.
а даже если и 6 лет опыта флаттера... Береш херячиш на флаттере 6 лет, а потом возвращаешся в прошлое. Изи. Все так делают
Dmitry Bubnenkov
Да не. Они рассчитывают что прям на альфе в прод хреначили
Igor
[
"подскажите плиз, можно ли отсортировать данные, которые получаем из Firestore, и как?\n\n",
{
"type": "pre",
"text": "StreamBuilder(\n stream: Firestore.instance\n .collection('projects')\n .snapshots(),\n\n",
"language": ""
},
"получаю внутри StreamBuilder ^\n\nсортирую так:\n",
{
"type": "pre",
"text": "snapshot.data.documents .map((doc) => Project.fromFirestore(doc))\n.toList()\n.sort((a, b) {\n return a.title.compareTo(b.title);\n}) ...\n",
"language": ""
},
"получаю \n",
{
"type": "pre",
"text": "type '(dynamic, dynamic) => dynamic' is not a subtype of type '(dynamic, dynamic) => int' of\nflutter: 'compare'",
"language": ""
},
""
]
???????
Ну так чего ты dynamic возвращаешь
???????
ангельским языком тебе сказано - перекасти в инт
???????
И да, вы снова и снова и снова и снова лажаете только из за того, что ленитесь в нормальную типизацию.
Igor
океей, а куда тут дальше типизировать то?
???????
В функции не указали типы. Предварительно не map'а, не cast'а
Sunny
Такс, 2 дня опыта, подсказывайте, как можно запустить while без заморозки основного потока? Нашел какой то пакет 'threading', но он тоже морозит весь UI
???????
Чего вы там сравниваете, что там должно быть, даже лень разбираться. Не читабельно и именно из за этой нечитабельности вы и сами не понимаете, что происходит в вашем коде и что чем является. Вот и вся ошибка.
admin
Дарт вроде же работает в одном потоке
???????
Эм?) У нас тут вообщет реактивщина)
???????
Очевидный async, для начала.
???????
[
{
"type": "pre",
"text": "Future myFunc() async {\n // ...\n}\n...\nonClick: myFunc(),",
"language": ""
}
]
Sunny
Не так меня понял, подожди, сформулирую чтоб понятно было
Igor
у меня сортировка по двум полям, firestore в реалтайме данные не отдает, когда добавляют 2 orderBy ?????>?
Igor
я-то как раз понимаю, что чем является, и дебаггер утверждает то же самое. на выходе перед сортировкой вот это вот
???????
А я утверждаю, что вы не понимаете)
Slava Marchenko
Чо ты как попугай ) он тут не поможет сколько бы раз не повторил
???????
[
"И не я один, дебагер со мной полностью солидарен:\n\n",
{
"type": "pre",
"text": "type '(dynamic, dynamic) => dynamic' is not a subtype of type '(dynamic, dynamic) => int' of\nflutter: 'compare'",
"language": ""
},
""
]
Igor
хорошо, я пришел в чат чтоб объяснили, или дали линк, где почитать
Igor
а не говорили, что я не понимаю
???????
Начните с проставления типов.
???????
Понял-принял, в реактивном погромировании async не нужон, когда интерфейс висит.
Slava Marchenko
Async функция с циклом внутри будет работать так же как и обычная функция.
???????
Так. Значит что надо сделать?)
Sunny
Короче говоря мне надо запустить цикл не из виджета, а из уже вызванной функции, по типу как 'ShouldEnsureUIThread' в QT, для того чтоб не блокировать основной поток, или в C# WinForms 'Invoke'
Slava Marchenko
Тогда будет в отдельном изолейте и интерфейс не будет висет
Slava Marchenko
[
{
"type": "link",
"text": "https://www.google.com/url?sa=t&source=web&rct=j&url=https://api.flutter.dev/flutter/foundation/compute.html&ved=2ahUKEwi0ysCWq9riAhWNuIsKHQGWB80QFjAAegQIBxAC&usg=AOvVaw2kYbdxq5nxUz5tjzPAKNmd"
}
]
Sunny
Опыта 2 дня, сформулировать нормально не могу, и найти из за этого тоже не выходит
Slava Marchenko
[
"Или ищи плугин isolate на ",
{
"type": "link",
"text": "pub.dev"
},
""
]
Slava Marchenko
Может тебе не нужно этого вообще делать
Slava Marchenko
Я имею ввиду таким образом делть
???????
Этож вам не сисярпа какаянить, делайте реактивненько
???????
Готов помочь, если скинешь демо версию своей проблемы.
???????
Можешь в дартпаде обозначить, если лень уж целый репозиторий делать или архив кидать с новым проектом.
Slava Marchenko
А ничо что reactive extensions пошли из c#?
???????
Можете сразу мне дать ссылку на rx, чтоб уж затраллировать наверняка)
Sunny
Да тут проект не нужен, есть переменная String, мне надо за ней следить, если она изменилась, выполнить код.
???????
Ну так сделайте StreamController
???????
Если вы для этого собрались делать бесконечный цикл, то вы оооооооооооооочень не правы)
Sunny
Та я ничего и не говорю о своей правоте, для меня это в новику, а опыта 2 дня, да
???????
Ну обождите, сча дам пример. Но сделать можно оооочень многими способами
Sunny
Я раньше вообще не работал с графическими фреймворками, были какие то мелкие, но чисто для себя чтоб не в консоли тыкаться
???????
Тут у вас вопрос и не в крафическом фреймвоке)
Igor
допустим, проставил. как так дальше выходит, что на выходе из sort получаем null?
Igor
[
{
"type": "pre",
"text": "flutter: The method 'map' was called on null.\nflutter: Receiver: null\nflutter: Tried calling: map (Closure: (dynamic) => Widget)",
"language": ""
}
]
???????
Вот, это уже продвижение, малаца. Накидай, если можешь, код в дартпаде. И входной json. Сделаю за тебя. Сча ток мальцу сверху выложу пример.
???????
[
{
"type": "link",
"text": "https://dartpad.dartlang.org/6e79a1f5cc6e32a4df1081bd27edb38c"
}
]
???????
Вот таким образом готовится реактивщина. Специально сделал именно так, чтоб самостоятельно разобрался в примере, от и до.
KDVMan
подскажите, widget это аналог this в другиях языках или что это? встречаю в коде иногда, но чет в документации не нашел
???????
Также, в самом интерфейсе для реакции его на изменение строки тебе надо будет использовать виджет StreamBuilder
???????
Забыл указать типы у принимаемых в sort параметров.
Igor
а оно тогда не работает ???>?
Sunny
getter, setter, точно, дебил, благодарю )
???????
Ну раз не работает, получается в этом и беда)
???????
Укажите dynamic или предварительно перекастите)
???????
Там весь фокус именно в StreamController и Stream Это прям основные кирпичики реактивщины, без них вы никуда не уедите)
Igor
а, ну с dynamic работает. а с Project нет
???????
[
"Значит перед sort надо сделать ",
{
"type": "code",
"text": "map ()\n\n"
},
"Яж вам изначально сказал, что беда именно в том, что вы не понимаете, где и какие типы у вас)"
]
Igor
так себе этот ваш дарт, все самому))
???????
Ну вы кидаете dynamic и хотите их сравнивать?)
???????
а если это null, а если это огурцы бабушки агафьи?)
Igor
ну я ожидаю, что после конструктора Project оно станет Project, а не останется dynamic
Igor
но видимо в такую магию дарт не умеет
???????
Ну ожидания расходятся с реальностью, такое бывает, сори)
Igor
ладно, после каста оно проходит сорт, но все равно после него null. сейчас попробую воспроизвести в репле
???????
Я вам крайне советую на будующее, если в языке можно указывать типы - указывайте, не ленитесь, от вас не убудет. И это не только дарта касается)
KDVMan
по моему вопросу никто не в курсе что ли?
???????
Ваша беда и грех тут только в том, что вы не указали, а потому и сами не понимаете, что происходит)
???????
Ну так widget этож строительный кирпичик интерфейса
Sunny
[
{
"type": "mention",
"text": "@PlugFox"
},
" Да, оставлю лучше на завтра, 30 градусов жары, духота, голова плывет, еще раз спасибо"
]
Slava Marchenko
State имеет ссылку на widget , это она и есть
Igor
ну да, зря ожидаю, что будет магия, как в других языках ??
???????
А this - обращение к самому классу и его эллементам
KDVMan
я про переменную, типа: widget._repository.getUser().then((user) { setState(() { _user = user; _isLoading = false; }); });
KDVMan
вот этот widget нигде не объявлено, отсюда я подумал что это типа this этого виджета?
KDVMan
ага, т.е. это сам state ?
???????
[
{
"type": "pre",
"text": "class A {\n A get widget => this; \n}\n\nvoid main() {\n A a = new A();\n print(a.widget == a); // true\n}",
"language": ""
},
"\n\nВообще законом не запрещено)"
]
???????
Но что у вас там - нажмите Ctrl + клик по интересующей штуке и все сами увидите)
KDVMan
вот нашет пример из оф.документов Widget build(BuildContext context) { return Container( color: widget.color, transform: Matrix4.diagonal3Values(_size, _size, 1.0), child: widget.child, ); } запутано как-то
Slava Marchenko
Нет. Внутри State можно так обращаться к виджету
Slava Marchenko
Это виджет
KDVMan
ок спасибо ) так понятнее )
???????
[
"Хорошо, тогда вот немного в виде дополнительного домашнего задания:\n",
{
"type": "link",
"text": "https://dartpad.dartlang.org/0022b93c0756e7eb8232d3fd4e43b9c8"
},
""
]
Sunny
[
{
"type": "mention",
"text": "@PlugFox"
},
" Благодарочка, есть ли вообще какие то книги, или вобще что-то почитать о этом?"
]
???????
У дарта и флатера одна из самых лучших документаций (ну в целом у гугла скорее)
Sunny
Просто я ничего толкового не нашел, ну документация это все таки немного не то
???????
[
"Ну можешь еще сюда заглядывать:\n",
{
"type": "link",
"text": "https://github.com/Solido/awesome-flutter"
},
"\n\nА так - для начала официальные ресурсы."
]
Igor
а, ну короче sort сортирует внутри, и возвращает void ?????>?
???????
[
{
"type": "link",
"text": "https://dart.dev/tutorials/language/streams"
},
"\n\nМожешь вот тут глянуть, на хабре перевод, вроде, был.\nНо она не очень понятная.\nПоэтому советую для начала разобраться со ",
{
"type": "code",
"text": "StreamController ()"
},
" и ",
{
"type": "code",
"text": "Stream()"
},
"\nЧто они умееют и могут.\n\nЕсли не понял еще что такое async await Future - начни с этого."
]
???????
Но разобраться с потоками - это мастхэв, для тебя это должен быть приоритет "Блокер", тк без этого ты дальше не уедешь (не только во флатере, а вообще в современных интерфейсах)
Igor
а можно тогда еще вопрос, почему ..sort(...) в таком случае не работает?
???????
сча, мне кажется, мне проще будет вам написать пример)
Igor
в репле оно работает ??
Igor
еще и форматирование съезжает
Igor
[
"и вдогонку еще один вопрос, \n",
{
"type": "code",
"text": ".sort((a, b) => Project.compare(a, b))"
},
" можно как-то упростить?\nтипа ",
{
"type": "code",
"text": ".sort(Project::compare)"
},
" в джаве?"
]
Slava Marchenko
Да как ты написал
Slava Marchenko
Сорт ждёт функцию
Slava Marchenko
А передавать анонимную функцию или другую это уже твое дело
Slava Marchenko
Прочитай вот эту штуку
Slava Marchenko
Она небольшая
Igor
я про то, можно ли это как-то записать без параметров, чтоб он их сам прокинул
Slava Marchenko
[
{
"type": "link",
"text": "https://dart.dev/guides/language/language-tour"
}
]
Slava Marchenko
:: такого нет в дарте
Slava Marchenko
Если там подходящая по сигнатуре функция то заработает
???????
[
{
"type": "link",
"text": "https://dartpad.dartlang.org/0f4c182950895f7033d26204911dad6a"
}
]
Igor
в репле оно и у меня заработало
???????
Вот, то что вы хотите. Обратите внимание, когда указаны типы - жить гораздо проще) В идеале, конечно, добавить бы проверок дополнительных и обработку исключений, но будем считать, что у вас бэк как у боженьки и все подкреплено юнит тестами)
Igor
бэк у меня firestore
Igor
поэтому даже json'а нет
???????
Не надо меня убеждать в том, что самому в firestore насрать нельзя)
Igor
оно конечно можно, но зачем)
???????
Не зачем, но как мы сегодня убедились, ожидания немного расходятся с реальностью)
|