Программирование : Dart & Flutter по-русски
Bekhzod Eshqo'ziev
Пусть TextFormField () принимает только числа
Makhmud Ushamiev
TextInputType.number
.Pasha Kruzenshtern
[
{
"type": "pre",
"text": "keyboardType: TextInputType.number,\ninputFormatters: [\n FilteringTextInputFormatter.allow(RegExp(r'[0-9]')),],",
"language": ""
}
]
Kirill Aparin
inputFormatters: [ FilteringTextInputFormatter.digitsOnly],
Anton Kowalski
[
"class LoginPage extends StatefulWidget {\n ",
{
"type": "mention",
"text": "@override"
},
"\n _LoginPageState createState() => _LoginPageState();\n}\n\nclass _LoginPageState extends State {\n\n ",
{
"type": "mention",
"text": "@override"
},
"\n void initState() {\n super.initState();\n }\n\n ",
{
"type": "mention",
"text": "@override"
},
"\n Widget build(BuildContext context) {\n Widget content = new Container(child: Text(\"Login\"),);\n\n return Material(\n child: Scaffold(\n body: Stack(\n children: [\n Container(\n child: Row(\n children: [\n TextButton.icon(\n onPressed: () => { setState(() => content = Login())},\n ),\n ],\n ),\n ),\n content,\n ],\n ),\n ),\n );\n }\n}\n\nclass Login extends StatelessWidget {\n ",
{
"type": "mention",
"text": "@override"
},
"\n Widget build(BuildContext context) {\n return Center(\n child: Stack(\n children: [\n Text(\"Login1\"),\n ],\n ),\n );\n }\n}"
]
Anton Kowalski
Все равно неработает
EcsFlash-
Вынести свой виджет content в отдельный виджет
Даниил Левицкий
Ну ты можешь через http client get запросом получать HTML и парсить его в виджеты
Даниил Левицкий
Но для всяких модных js фреймворков это будет плохо работать
Makhmud Ushamiev
Чувак подкрути стейт менеджмент. Все равно рано или поздно тебе придется изучить и использовать один из них)
Даниил Левицкий
Можно попробовать сделать свой Плагин с вебвью, которая будет тебе стримом передавать HTML, от тебя получать эвенты и нажимать на js кнопки, и ты все красиво закрутишь
EcsFlash-
А дальше, там где ты его юзаешь, сделай типо Second ? Login : content
EcsFlash-
+, я просто скинул самый простой пример
EcsFlash-
Где Second это булева переменная, ее и меняешь в сетстейт на нужное тебе значение, в твоём случае будет true
EcsFlash-
Я кстати тоже сетстейт юзаю, когда что то простое) например смена цвета по движению слайдера
Anton Kowalski
А SetState не то?
Makhmud Ushamiev
i++. Для минимальной фигни это идеальное средство
Makhmud Ushamiev
Сетстейт сбросится если перебилдить виджет, который находится выше по дереву
EcsFlash-
Сетстейт это отвёртка, а к примеру Bloc это шуруповёрт
EcsFlash-
Понимаешь же что шуроповертом получится качественней, надежней
EcsFlash-
И его используют для больших, сложных вещей
EcsFlash-
А отвертку для чего то маленького, простого
EcsFlash-
+шуроповертом можно и как гаечным ключом работать, и как дрелью
EcsFlash-
Разница в качестве, функционале и производииельности
Aleksey
Всем привет. Спасибо админам за создание этого чата. Посоветуйте книги по сему чуду, чтобы побыстрее вкатиться , без разжевывания что такое переменная и тд
Anton Kowalski
В моем случае разве нужен bloc?
EcsFlash-
Это просто пример сравнения Стейт менеджеров
Kirill Aparin
А есть примеры?
Anton Kowalski
[
{
"type": "link",
"text": "https://bloclibrary.dev/#/flutterbloccoreconcepts"
},
" это он?"
]
EcsFlash-
В данном случае тебе никакой блок не нужен
EcsFlash-
Он, пока он тебе не нужен
EcsFlash-
Чтобы его юзать, нужно кучу всего знать)
Anton Kowalski
ок а что я не так сделал с setState
EcsFlash-
Человек с сетстейт не очень дружит, а ты про блок говоришь)
EcsFlash-
Черкни мне в лс
Anton Kowalski
Ну я как увидел то сразу понял
Michael Bazilique
ребят, кто работал с social_share
Michael Bazilique
мне обязательно создавать свой facebook_app что получить его ID?
Michael Bazilique
можно как-то по другому, если мне просто надо что-бы юзер у себя мог запостить текст в FB feed?
Michael Bazilique
а инстаграм/whatsapp так же нужен фб id?
Константин Бобров
есть параметр, который отвечает за то, чтобы нижняя граница поднималась при малейшем скролле содержимого страницы вверх???
Константин Бобров
ну, чтобы она сразу в конечное положение становилась?
Vitaliy
В Dart совсем никак нельзя деструктор для объекта создать, правильно понимаю?
Mykola Shevchenko
Я интересовался этим вопросом. И как я понял, нельзя ни деструктор, ни финализатор. Приходится пользоватся интерфейсом disposable
Vitaliy
[
"это которое в пакете ",
{
"type": "code",
"text": "w_common"
},
" ?"
]
Mykola Shevchenko
Вроде да, не помню
Mykola Shevchenko
Но его в ручную приходтся вызывать
Vitaliy
Ой, так тогда смысла нет получается? С таким же успехом можно в свой класс запихать свой "деструктор" и его самому вызывать. Так получается?
Vitaliy
Грусть. Пичаль. Тоска. Понятно, спасибо ??
Даниил Левицкий
Ты не можешь гарантировать когда объект деструктурируется
Даниил Левицкий
поэтому деструкторы бесполезны
Vitaliy
Сильное заявление.
Vitaliy
Мне неважно когда. Если когда-нибудь оно будет уничтожаться, я хотел бы об этом знать и выполнить перед этим моментом какой-то код, это всё что мне нужно.
Max
В фазе Garbage collection?
Vitaliy
Мне надо освободить ранее выделенную через FFI память. Так что пофиг когда.
Max
Мне кажется, это точно должно быть ручным действием. Не как destruction, а как отвязка от FFI. И это очень экзотический сценарий.
Vitaliy
С чего это прямо таки должно быть ручным действием? Класс хранит в себе указатель на выделенную ранее память. Пока класс жив - данные могут понадобиться. Как только класс уничтожается, данные не нужны и тоже должны быть уничтожены. Это же классический RAII.
Max
Речь о классе, "растянутом" на две платформы с разными технологиями управления памятью. Уверен, что попытка автоматизировать процесс приведёт к куче корнер-кейсов, которые сложно не только разрешить, но даже описать. Не уверен, что Garbage collector в принципе может очистить объект, для которого выделены FFI-ресурсы.
Vitaliy
Никто никого не растягивает. Речь о классе, который является обёрткой над данными скрытыми за FFI. Класс трансформирует вызовы из dart-кода, и вызывает внешний код, затем получает результат и преобразует в dart обратно. Всё как у всех и никакой магии. Освобождение ресурсов выполняется вызовом dart-функции, так же, как и любое другое взаимодействие через FFI, с чего бы тут чему-то не работать? Это ведь будет тот же самый dart: вызвать одну функцию у класса, не более. Почему именно деструктор вызывает опасения за стабильность?
Tim
Ребят, поделитесь, пожалуйста, опытом: если при переходе на страницу нужно отображать там данные с БД (sqlite), есть ли смысл заранее вытягивать данные или нормально это делать в initState?
Max
Дело ваше, но я бы точно описывал этот вызов в коде в явном виде, а не доверял автоматике. Уверен, что при оценке необходимости GC движок DART оценивает только объём памяти, аллоцированной внутри Dart.
Max
Очень по разному бывает. Нужно смотреть пользовательские сценарии целиком. Но обычно запрашивают те данные, которые пользователь сейчас захотел, по мере навигации. Осмысленный Pre-fetch это уже следующий уровень)
Vitaliy
Ну вот да, это довод пожалуй разумный ?? Но всё равно, отсутствие возможности вызова функций при уничтожении объектов - абида. :(
Max
Или ты имеешь в виду локальную БД, не сервер? Тогда, конечно, ничего не нужно, читай как запросят.
Tim
В принципе нет такой best-practices когда в каком нибудь глобальном сервисе притягивают данные из БД, чтобы при навигации интерфейм работал плавнее? В моем случае, это запросить <100 сущностей из БД и сделать COUNT запрос с группировкой на табличке с ~2к записями
Max
Не стоит тащить в один язык привычки из другого. Я напомню, что одна из фич Dart - бесшовная транспиляция в JS. Одно это уже поясняет, что такая фича невозможна.
Tim
Все верно, речь о локальной БД
Max
UI всегда медленнее локальных вычислений, если это не супер-криптография/математика.
Max
Пока играет анимация переключения экранов - всё зафетчишь и отсортируешь без проблем.
Tim
Вычислений - да, но тут запрос в постоянную память
Max
Один кадр это 16ms. Можешь тесты сделать, сколько занимает фетч и сортировка.
Tim
Пока так и делаю, но думал мб пора как то "расглаживать"
Tim
А вот это хорошая идея, можно попробовать
Tim
Причем пакет sqlite всегда работает в отдельном изоляте, верно?
Max
Не работал с ним, но предполагаю, что для базы своя Activity, да.
Даниил Левицкий
Типа прикол в том, что в плюсах например, вы в явном виде вызываете уничтожение объекта
Даниил Левицкий
поэтому в явном виде вызывается деструктор
Даниил Левицкий
по какой такой причине, вы не хотите сделать метод .destruct и вызвать его, мне не понятно
Даниил Левицкий
ведь в языках с деструкторами, вы бы обязаны были вызвать. удаление из памяти вручную
Vitaliy
[
"Ну, в современных подходах в разработке, очищение памяти делается уже зачастую автоматически, а не вручную. Даже в С++. Я, к сожалению (а может и к счастью) С++ не знаю, но знаю что в нём для автоматического управления памяти активно используют умные указатели (владеющие счётчики ссылок).\nЯ пишу на Rust, там вообще проблем с памятью нет (и это при отсутствии GC).\n\nДа, я написал метод ",
{
"type": "code",
"text": "destruct"
},
", буду вызывать его. Из-за отсутствия других вариантов. ??"
]
Даниил Левицкий
А в Rust автоматическое управление памятью и есть деструкторы?
Даниил Левицкий
Там судя по всему используется подход, как в GO, когда при компиляции раставляются деструкторы на основании дерева вызовов
Vitaliy
Да (с оговорками) \ Да (с оговорками)
Vitaliy
В golang вроде полноценный GC...
Даниил Левицкий
Ну я имел в виду сам подход
Даниил Левицкий
там при компиляции размечаются места, когда можно почистить память
Даниил Левицкий
за счет чего он не вызывает лаг, как в jvm и подобных
Vitaliy
Нет, в Go и Rust подходы абсолютно разные. В Go - полноценный сборщик мусора, а Rust работает по-другому: на стадии компиляции идёт анализ кода и вставляются вызовы деструкторов объектов, переменные которых выходят из области видимости в коде. Ну в общем, это уже оффтоп. Почитай на досуге если интересно, советую ??
roi peker
[
"Sorting dropdown demo with graphx:\n\n",
{
"type": "link",
"text": "https://graphx-dropdown-4.surge.sh/#/"
},
"\n\n(based on ",
{
"type": "link",
"text": "https://dribbble.com/shots/7116566-Sorting-Button"
},
")"
]
Константин Бобров
Привет. может есть у кого идеи как реализовать? это "шапка" приложения.
Vadim Lukichev
[
"Для натива, в мастере финализаторы уже есть ",
{
"type": "link",
"text": "https://github.com/dart-lang/sdk/issues/35770"
},
""
]
Константин Бобров
да, уже понял.
Константин Бобров
Спасибо
Мirshod
[
"Привет. Как можно обновить FutureProvider? Через showModalBottomSheet я выбираю id. И даю на FutureProvider. Но он первый раз уже загрузил данный. Повторно не загрузиться? ",
{
"type": "link",
"text": "https://github.com/rrousselGit/river_pod/issues/276#issuecomment-761742821"
},
" можете посмотреть мой код."
]
Даниил Левицкий
Я же 5 сообщений выше тоже самое написал)
Sergey Hottabych
Что-то случилось после нового года, и я не могу собрать билд на телефон
Sergey Hottabych
flutter doctor
Sergey Hottabych
Ощущение, как будто он сам отсоединяется во время билда
Sergey Hottabych
На эмулятор устанавливается без проблем
Sergey Hottabych
flutter clean пробовал
Sergey Hottabych
Разрешения на отладку по USB даны
Serge Shkurko
Возможно MIUI обновился и теперь при установке на устр-ве выскакивает окно с вопросом об установке по USB, оно 10 секунд активно после чего сбрасывает установку
Sergey Hottabych
Оно у меня не выскакивает
Sergey Hottabych
Знаю про такое окошко
Stanislav Ilin
Проверьте ещё свободное место на телефоне. Не помню какой при этом код. Но это тоже ADB ошибка.
Sergey Hottabych
Я удалил несколько ненужных приложений, не помогло. Да вообще места достаточно.
Stanislav Ilin
Тогда не знаю в чем дело)
Sergey Hottabych
И я не знаю)
Олжас Сулеймен
а есть test типа noThrows?
Иска
Всем салам, я новичок. Можете посоветовать с чего начинать? Курсы, Ссылки
Евгений
Это ты Навального траванул?
John
[
"Подскажите как расположить виджет поверх всех экранов?\nХочу сделать плеер внизу приложения, которое выезжает при проигрывании аудио.\n\nПопробовал воткнуть через Stack внутри MaterialApp. Всё работает как надо кроме того что там не работает Navigator.pushNamed \n",
{
"type": "pre",
"text": "Navigator operation requested with a context that does not include a Navigator.",
"language": ""
},
""
]
Mykola Shevchenko
Посмотри overlay
Andrew
Есть текст в контейнер с декорацией. Контейнер динамически изменяет свой размер(width) в зависимости от длины текста. Как ограничить width контейнера, чтобы ширина не была больше этого значения? Constraints не работает, выставляет фиксированное maxWidth.
ethorz ??
привет, пытаюсь вынести роуты в отдельный файл, но не понимаю, как лучше это сделать
Maks Kravchenko
а что в этом варианте не нравится?
ethorz ??
разобрался, ошибка была вообще в другом)
Sergey Hottabych
Row, в нем ConstrainedBox с maxWidth = 0.75 * MediaQuery.width, в нем твой Text
ethorz ??
единственное что, нельзя сделать в виде api.auth
Sergey Hottabych
Будет автоматически переноситься, если текст шире 3/4 экрана
Sergey Hottabych
Если тест прошёл, это и значит, что noThrows
John
Не понял как его туда присобачить чтобы работал как надо. Пока решил через передачу ключа навигатора, не знаю насколько это костыльно, но работает :)
Даниил Левицкий
Ты можешь сделать класс и поля в нем же, по сути будет тоже самое, но ты сможешь делать такие обращения
Даниил Левицкий
Типа RouteConfig, который в конструкторе примет env
.Pasha Kruzenshtern
Здравствуйте! Как сделать такой эффект на камере? Стэком добавил контейнер с полупрозрачным черным, а как сделать квадратный вырез посередине?
ethorz ??
о, хороший вариант, но я смогу обращаться к ним напрямую, если только это будут статичные свойства? Или я ошибаюсь?
Константин Бобров
кто знает как можно сделать вырезанный кусок окружности (как секция в pie chart), и по возможности задать точку откуда рисовать (точку на исходной окружности) ? желательно контейнером или чем-то близким по свойствами
Даниил Левицкий
Сделать синглтон
Даниил Левицкий
Закрытый интерфейсном
Даниил Левицкий
Им обращаться к свойствам объекта
Даниил Левицкий
Это чтобы в будущем ты конфиг мог быстро поменять
Даниил Левицкий
Либо сделать просто так, чтобы он читался из ямл файла
Даниил Левицкий
Тогда тебе не нужен будет интерфейс
ethorz ??
да, вот это сейчас и делаю
Andrey Eremenko
[
"По локализации, подскажите пожалуйста, если мне надо для двух языков показывать следующие фразы:\n",
{
"type": "underline",
"text": "ru:"
},
{
"type": "italic",
"text": " Пользователь %NAME% купил 10 погремуш"
},
{
"type": "bold",
"text": "ек\n"
},
{
"type": "underline",
"text": "en:"
},
{
"type": "italic",
"text": " User %NAME% bought 10 rattles\nПри"
},
" этом если пользователь женского пола а погремушка одна, то должно быть\n",
{
"type": "underline",
"text": "ru: "
},
{
"type": "italic",
"text": "Пользователь %NAME% купил"
},
{
"type": "bold",
"text": "а"
},
{
"type": "italic",
"text": " 1 погремушк"
},
{
"type": "bold",
"text": "у\n\n"
},
"Смотрю доку ",
{
"type": "link",
"text": "https://flutter.dev/docs/development/accessibility-and-localization/internationalization"
},
"\nи не вижу как там менять склонение, род, число, в зависимости от некоторых переменных, доступных во время отрисовки виджета"
]
Andrey Eremenko
[
"кажется нашел тут: ",
{
"type": "link",
"text": "https://pub.dev/packages/intl"
},
""
]
Combot
Total messages: 307261
Iliya Efimov
[
"Что сей падле может не нравится? Все обновлено, место есть, прочие подсказки с ",
{
"type": "link",
"text": "https://stackoverflow.com/questions/36841461/error-android-emulator-gets-killed"
},
" тоже не сработали( В какую область вообще смотреть еще можно?"
]
Andrey Eremenko
попробуй это, во многих непонятных случаях помогает
Дмитрий Щербаков
Не срача ради вставлю 2 копейки) если речь идёт про андроид/иос то смысла нет в ручном управлении памяти (да и винда и линупс туда же). Ручное управление оправданно в случае микроконтрллеров либо джвижков игры например, в остальных случаях 99% утечек решается на уровне ОС. Но опять же это не призыв к тому что нужно писать говно код который не диспозит стримы напрмер
Max
Читайте выше, речь шла про FFI
Анатолий
еще может памяти на компе не хватать
Iliya Efimov
Хз, 16 гигов вроде, если про оперативку. Места на диске с избытком.
Анатолий
про оперативку да, если ее не ватит система может молча грохнуть самое прожорливое приложение и им может оказаться эмулятор
Ivan Nazarov
[
"Добрый день всем. Пытаюсь запустить эмулятор на Kali Linux последней версии. Начинается загрузка и виснет система (насовсем). Попытался собрать проект на подключенное устройство но выдавало ошибку \"adb: insufficient permissions for device: missing udev rules? user is in the plugdev group\". Перешел по ссылке в ошибке (",
{
"type": "link",
"text": "https://developer.android.com/studio/run/device"
},
"). Выполнил команду sudo usermod -aG plugdev ",
{
"type": "cashtag",
"text": "$LOGNAME"
},
". Прошла вроде успешно. Затем выполняю вторую команду по инструкции apt-get install android-sdk-platform-tools-common. Выдает ошибку Package android-sdk-platform-tools-common is not available, but is referred to by another package.\nThis may mean that the package is missing, has been obsoleted, or\nis only available from another source.\nПодскажите как начать работу на линукс, пожалуйста."
]
Ivan Nazarov
Могу скинуть ошибку которая вылетает при запуске эмулятора для большего понимания проблемы
ethorz ??
использую http либу для запросов, как можно обработать глобально 401 ошибку, чтобы сделать редирект на страницу авторизации ?
Anton Kowalski
[
"class LoginPage extends StatefulWidget {\n ",
{
"type": "mention",
"text": "@override"
},
"\n State createState() => new _LoginPageState();\n}\n\nclass _LoginPageState extends State {\n ",
{
"type": "mention",
"text": "@override"
},
"\n void initState() {\n super.initState();\n }\n\n ",
{
"type": "mention",
"text": "@override"
},
"\n Widget build(BuildContext context) {\n String t = \"d\";\n return Material(\n child: Scaffold(\n appBar: AppBar(\n title: Text(t),\n ),\n body: Stack(\n key: Key(\"Stack\"),\n children: [\n Container(\n child: Row(\n children: [\n TextButton.icon(\n onPressed: () {\n setState(() {\n t = \"sfdf\";\n print(t);\n });\n },\n icon: Icon(\n Icons.login_outlined,\n color: Colors.white,\n ),\n label: Text(\n \"Login\",\n style: TextStyle(color: Colors.white),\n ),\n ),\n ],\n mainAxisAlignment: MainAxisAlignment.end,\n ),\n margin: EdgeInsets.only(right: 50, top: 15),\n ),\n ],\n ),\n ),\n );\n }\n}\n\nПри нажатии кнопки, AppBar не меняеться, почему?"
]
Вадим
Потому что после setstate вызывается build, а в нём t="d"
Anton Kowalski
да, протупил, спасибо
EcsFlash-
Отлаживайся на реальном телефоне, у меня 1 раз не получилось эмуль на кали поставить, я забил, телефон по юсб подключил и все
Ivan Nazarov
Та уже понял. Спасибо за ответ.
EcsFlash-
Кали на самом деле странная штука)
Anton Kowalski
[
{
"type": "link",
"text": "https://i.pinimg.com/originals/38/a7/f8/38a7f861d2c6e5624db27fd3ea086876.gif"
},
"\nКак такую анимацию сделать?"
]
XbIK
[
"stack и ",
{
"type": "link",
"text": "https://api.flutter.dev/flutter/widgets/AnimatedPositioned-class.html"
},
""
]
Даниил Левицкий
ну тебе нужно разбить над подвиды анимаций, перемещения, альфы
Даниил Левицкий
сделать общий анимешен контроллер
Даниил Левицкий
и подключить к нему остальные анимации
Anton Kowalski
Что такое альфа?
Даниил Левицкий
Коэфициент прозрачности
nazirjon
Ребята, плагин background fetch не работает в ios?
Константин Федуров
[
"Касательно анимации мне кажется тут можно найти много интересного",
{
"type": "link",
"text": "https://iiro.dev/2018/03/14/orchestrating-multiple-animations-into-visual-enter-animation/"
},
""
]
Константин Федуров
там как раз рассматривают сложные комбинации из анимаций
Anton Kowalski
Спасибо, работаю
Anton Kowalski
У размер как?
Даниил Левицкий
на твоем видосе нет изменений размера
Даниил Левицкий
но вообще есть специальный AnimatedProperties
Даниил Левицкий
или как-то так
Даниил Левицкий
и AnimatedSize скорее всего есть
Anton Kowalski
зеленый блок увеличивается-уменьшается при перемещении
Даниил Левицкий
ага, действительно
Даниил Левицкий
в общем там есть куча подклассов делегирующих разные анимации
Anton Kowalski
Size фактически после перемещения остаеться такого же размера
Anton Kowalski
и как анимация на размер будет влиять?
Вадим
Размер можно в AnimatedContainer менять
Anton Kowalski
как запустить анимацию изменения размера хотя размер останиться тем же
Sirojiddin
как создать pdf
Anton Kowalski
[
"Вот что я сделал \nchildren: [\n AnimatedPositioned(\n duration: Duration(seconds: 1),\n child: Container(\n decoration: BoxDecoration(color: ",
{
"type": "link",
"text": "Colors.blue"
},
"),\n ),\n top: 0,\n bottom: 0,\n right: LoginSignIn ? MediaQuery.of(context).size.width * 0.6 : 0,\n left: LoginSignIn ? 0 : MediaQuery.of(context).size.width * 0.6,\n curve: Curves.easeOutQuart,\n ),\n AnimatedPositioned(\n child: TextButton.icon(\n onPressed: () => setState(() => LoginSignIn = !LoginSignIn),\n label: Text(LoginSignIn.toString()),\n icon: Icon(Icons.login),\n ),\n duration: Duration(seconds: 1),\n top: 0,\n bottom: 0,\n right: LoginSignIn ? 0 : MediaQuery.of(context).size.width * 0.4,\n left: LoginSignIn ? MediaQuery.of(context).size.width * 0.4 : 0,\n curve: Curves.easeOutQuart,\n )\n ],"
]
Sirojiddin
как создать pdf
Anton Kowalski
Вот что сделал, а как сделать изменение размера синего контейнера как на примере(зеленый)?
Халид Хушмадов ???? ??? ?????
Посоветуйте пожалуйста я новичок в программировании. Что мне выбрать для изучения. kotlin или flutter я уже где-то 3 недели учу котлин
Mikhail Kolchanov
Флаттер конечно же
Vitaliy
Это как в анекдоте с опросом "пользуетесь ли вы интернетом"?
Anton Kowalski
Тот эффект который я хочу надо делать через контроллер?
Даниил Левицкий
А какие цели?
Даниил Левицкий
Вообще Kotlin это язык, а флаттер фреймворк
Даниил Левицкий
Например, возможно вы хотите микроконтроллеры разрабатывать
Даниил Левицкий
я бы на вашем месте задумался о чистом C
Халид Хушмадов ???? ??? ?????
Да я в курсе просто под мобилки хочу писать 3 недели как учу котлин 2 книжки купил. Потом знакомы говорит оставь это лучше займись flutter-ом это кросплатформенная и. Т. Д И я такой в ступор попал что мне делать.
Пронин Андрей
Учить дарт и флаттер
|