Программирование : Dart & Flutter по-русски
Sergey Lavinov
Или только риплы по умолчанию?
Sergey Lavinov
Хрен с ним, свой написал -_-
Slava Marchenko
Привет. никто не сталкивался во флаттере на ios при вызове showDialog( ... AlertDialog темнеет экран, но самого диалога не видно? На Андроиде все работает
???????
[
"Поделюсь еще полезным сниппетом (может кто улучшит):\n",
{
"type": "link",
"text": "https://dartpad.dartlang.org/de8129130c0bfe91276e43dccce7becd"
},
""
]
Егор Шепелев
Ребят, а есть тут кто из шарпистов? Реально ли замутить что-то типа байндингов?
???????
Ну а что мешает сделать поток состояний и слушать его?
???????
Реакция интерфейса на смену состояний - суть определение реактивного патерна погромирования)
Егор Шепелев
Чувство какого-то костыля. Или это нормальная практика?
???????
Эм, в этом вообщет весь смысл и все от и до желательно делать на потоках. повсеместный императивный подход с вызовом setState() - до добра не доведет в больших приложениях.
Егор Шепелев
Понял, спасибо. Я просто еще маленький и глупый, так что не надо сильно на меня ругаться. :D
???????
Обратите внимание очень у многово есть listen() и шоткаты к нему.
Егор Шепелев
Хорошо. Спасибо огромное.
???????
Ага. Тобишь в этом весь смысл реактивщины - реакция на состояния. И тут это повсеместно) Если только-только пришли, то есть такая штука как "BLoC" архитектура. Собственно помогает реализовать События порождающие Состояния, на которые реагируют отдельные элементы интерфейса. Ну и подсказывает как разнести интерфейс и бизнес логику приложения (по сути BLoC выступает связующим звеном между этими вещами). Для понимания сам патерн и архитектура могут быть сложными после императивщины и это займет какоет время, но это мастхэв)
Егор Шепелев
Жаль, что в телеге еще не сделали плюсики в карму. :D
???????
Немного разгребу завалы и может начну писать в медиум, там сможете похлопать)
???????
В общем BLoC это и есть ваши биндинги) Если так задуматься)
???????
[
{
"type": "link",
"text": "https://pub.dev/packages/bloc"
},
"\nКартинку тут можете глянуть"
]
Егор Шепелев
Вроде как да. Буду усердно читать. ЕЩе раз благодарю
???????
[
"Начните с разборов примеров на этой странице:\n",
{
"type": "link",
"text": "https://pub.dev/packages/flutter_bloc"
},
"\n\nНаскоком вряд ли все осознаете, нужно будет покапаться и шишек набить."
]
???????
[
"Я примерно так его готовлю:\n",
{
"type": "link",
"text": "https://dartpad.dartlang.org/99c6118789c4bbc7d04690f5ca93ee21"
},
""
]
admin
Комментарии на русском? Или это просто для себя?
???????
Ну я говорю на русском, это мой гист, почемуб мне не оставлять комментарии на русском?)
admin
Ну по всяким код-стайлам и пр. руководствам желательно комментарии на english писать. Поэтому удивился, а так норм.
???????
[
"Более того, если вы полистаете мой гист чуть дальше первой странички, вас может удар хватить в таком случае)\n",
{
"type": "link",
"text": "https://gist.github.com/PlugFox"
},
""
]
Кирилл Пешин
Всем привет... кто нибудь знает почему flutter build apk --release --target-platform=android-x64 и android-x86 не собираются?? Пишет: "android-x86" is not an allowed value for option "target-platform". Хотя если смотреть -h : --target-platform [android-arm (default), android-arm64, android-x86, android-x64]
Семён undefined
можно как нибудь внести изменения в context?
???????
Могу ошибаться, но для этого и нужен инхерит виджет. Манипуляции с контекстом.
Семён undefined
а как можно сделать общие переменные для нескольких классов? в C# я создавал для этого другой класс Data и инициализировал там переменные со стандартными значениями, а потом кидал всем классам переменную с инициализированным классом
Семён undefined
но тут дичь
Оганнес Асатрян
Тут норм язык
Оганнес Асатрян
Делай класс и наследники как пример
Семён undefined
ну как бы шарп оопшнее оопшных
Семён undefined
мне это не нужно
Семён undefined
мне надо, чтобы если меняешь переменную в первом классе, то она меняется и во втором
Оганнес Асатрян
Без комментариев
Семён undefined
в шарпе работало идеально и без вопросов
Семён undefined
может как нибудь контекст родителя получить?
Оганнес Асатрян
Пахнет синглтоном
Семён undefined
ну мой проект на шарпе таким и был
Оганнес Асатрян
Бахни синглтоном чо
Оганнес Асатрян
И из каждого класса дергай метод
Sergey Lavinov
Можно экраны в TabBarView как-то предзагрузить? А то при свайпе виден белый экран, который через мгновение превращается в мою вкладку
Семён undefined
ты пробовал запускать в релиз?
Семён undefined
производительность ухудшается у дебаг версии
Sergey Lavinov
Если это мне, то да, в релизе тоже мерцает
???????
[
"Удваиваю синглтон.\n\nСмотри как здесь классы ",
{
"type": "code",
"text": "Repository"
},
" и ",
{
"type": "code",
"text": "RepositoryProvider"
},
" сделаны:\n",
{
"type": "link",
"text": "https://dartpad.dartlang.org/99c6118789c4bbc7d04690f5ca93ee21"
},
""
]
Семён undefined
короче мне надо шобы так работало
???????
Пример тебе дал. Ты именно репозиторий хочешь, 1 в 1
???????
Алсо, есть ощущение, что ты тут пытаешься сделать геттер.
???????
[
{
"type": "code",
"text": "int get blahblahblah => this.data.blahblahblah"
}
]
Семён undefined
изменять тоже нужно
Семён undefined
геттер будет в другом классе
???????
ну делай и сеттер, тогда
???????
Какие проблемы?) Так в любом языке, включая сисярпу.
???????
Если хочешь просто при создании объекта разово присвоить именно значение, а не организовать линк, у тебя для этого конструктор есть.
???????
[
"вот такая запись:\n",
{
"type": "pre",
"text": "class A {\n int b = 1;\n int c = this.b*2;\n}\n",
"language": ""
},
"аутизм чистой воды)\n\nВот пару вариантов:\n",
{
"type": "code",
"text": "class A {\n static int b = 1;\n int c = A.b*2;\n}"
},
"\n\n",
{
"type": "code",
"text": "class A {\n int b = 1;\n int get c => this.b*2;\n}"
},
"\n\n",
{
"type": "code",
"text": "class A {\n int b;\n int c;\n A() {\n this.b = 1;\n this.c = this.b*2;\n }\n}"
},
""
]
Anton ?? ? ??
у меня они будто предзагружены в релизе
Sergey Lavinov
Хорошо тебе, наверное
Anton ?? ? ??
но возможно у тебя виджеты ВОЗМОЖНО грузятся > 16 мс
Anton ?? ? ??
и из-за этого проблемы
Sergey Lavinov
Полагаю, что так. Там каждый таб - отдельный экран
Anton ?? ? ??
у меня тоже отдельный экран - Scaffold()
Sergey Lavinov
И прям моментально грузится?
Anton ?? ? ??
они должны перерисовываться при каждом тапе? Да или нет, в моем +- все норм, я не замечаю мерцания, честно. можешь записать как у тебя это происходит? можешь в лс
Anton ?? ? ??
или просто хелло ворлд накидать
Anton ?? ? ??
Биток растет => растет кол-во рекламы в телеге
Evgeny Kot
Так, кто имел опыт антиспам ботов? Combot вроде ничего, но платный
???????
Наконецто руки дошли?) Яб взялся, но и так пет проектов куча, могу подсказать с реализацией и api.
???????
Для начала можно попробывать daysandbox бота, хоть чтото
???????
[
{
"type": "link",
"text": "https://habr.com/ru/post/348800/"
}
]
Evgeny Kot
Я бы с радостью взял готового, а не писал бы сам
Evgeny Kot
Спасибо за ссылку
???????
Для начала daysandbox можно воткнуть, если других идей нет. Ложных срабатываний не будет, он никого не банит.
???????
А вообще, надо просто собирать информацию по сообщениям для каждого пользователя в чате. Если меньше 5 текстовых сообщений - тереть все кроме текста. Это должно на корню вырубить весь спам.
???????
Заодно статистика будет)
Evgeny Kot
Покрывают ли он случай: "я новичок пытаюсь найти информацию в интернете, ничего не могу найти, натыкаюсь на чат. Пишу туда что-то типа: Привет всем Как мне во Flutter сделать Х". А бот не даёт это сделать пока не пройдет один день
???????
Он не стирает текстовые сообщения)
Gabben
Я новичек, блаблабла, вот вам ссылка на вопрос с SO
???????
Кстати, есть отдельные боты, которые трут сообщения "привет" во всех их вариациях и языках)
Gabben
из-за ссылки улетает в бан
???????
Бот не банит, я думал я доступно это донес
???????
Если боты и реклама начнут быть более агрессивной, возможно вернемся к нулевым, когда заходя на хаб нужно было подтвердить регистрацию на канале)
Gabben
Капча-бота запилить на коленке и все, если платить не хотите
???????
[
"Это будет в разы сложнее описаного тут решения.\n",
{
"type": "link",
"text": "https://t.me/rudart/70274"
},
"\n\nСрать капчей в общий чат - плохая идея.\nНужно будет делать поток авторизации (напоминаю, что бот не может инициировать общение).\nМимо делал авторизацию через Google OAuth2 в телеге)"
]
Alik E.
Не понимаю, почему просто не запретить новым персонажам все ссылки, кроме медиума, флаттер, дарт, ангулярдарт и СО?
Анатолий
на сколько новым?
Анатолий
хабр? гитхаб? битбакет? гитлаб?
dmitry isachenkov
Привет, на просторах интернета нашел нечто подобное, это не считается за гавнокод? потому что со стороны если смотреть, то попахивает
DVS (Read The F.ng Manual) Studio (NoHello)
кастомный гитлаб? )
Анатолий
ну я сомневаюсь что новички будут его использовать
Alik E.
Ну если меньше 5 сообщений, например
Alik E.
Кто-то даёт на них ссылки? Обычно же у компаний такое
DVS (Read The F.ng Manual) Studio (NoHello)
ну я несколько раз тут постил сниппет на своем гите, но формально он компании и да.. скорее не стоит)
dmitry isachenkov
хотелось бы при логине попадать на следующую страницу, но логика авторизации лежит в Bloc компоненте. у меня есть стрим, в котором при авторизации должен появится токен, и типа когда он появился, хотелось бы попасть на другую страницу. из решений нагуглил 2 способа: 1-на скрине, второй через delayed в initState. На мой взгляд оба решения не самые элегантные, поэтому хотел спросить есть ли более правильное решение этой проблемы?
dmitry isachenkov
заранее спасибо за помощь)
???????
Да. Тут плохо сделано
???????
Сейчас раскажу как сделано у меня
dmitry isachenkov
Я как то натыкался на пример, где автор использовал виджет типа streamBuilder'а но у него был дополнительный параметр listen или listener, но чего-то при повторном гуглении ничего подобного не нашёл
???????
[
"при использовании БЛоКа в корне приложения ты все равно делаешь стейтфул виджет.\n\nфактически у тебя должно быть 3 разных класса и каждый с material app:\n1. инициализация приложения, бд, начальные настройки, темы, все такое\n2. приложение логина\n3. собственно само приложение с роутером, загруженной в шаге 1 темой и всем таким\n\nНЕ ИСПОЛЬЗУЕШЬ БЛОК БИЛДЕР, ОН ДЛЯ ДРУГОГО!\n\nПросто слушаешь поток через ",
{
"type": "code",
"text": "yourBloc.state.listen()"
},
" если прилетает то что надо, делаешь ",
{
"type": "code",
"text": "setState()"
},
" с параметром указывающим на то, какое именно приложение из 3ех сейчас строить."
]
???????
Таким же макаром делается ребилд при изменении настроек оформления приложения. НИКАКИХ СТРИМ БИЛДЕРОВ, БЛОК БИЛДЕРОВ ИЛИ ЕЩЕ ЧЕГО ПОХОЖЕ В САМОМ ДЕРЕВЕ ПРИЛОЖЕНИЯ ДЛЯ АВТОМАТИЧЕСКОЙ НАВИГАЦИИ. Тебе даже в консоли, по идее, должно было жалобно попенять при переходе.
dmitry isachenkov
Так как я понял стримбилдер в дереве имеет прикол не перерендеривать все дерево, а только то, что внутри билдера
dmitry isachenkov
Ну это понятно, я и подумал, что так себе варик
???????
Дело в том, что в твоем случае надо вообще все перерендеривать. Но при этом тебе НЕЛЬЗЯ это делать при изменении каждого состояния, а только на определенные (в корне приложения это очень больно и приведет к плохим последствиям). А также у тебя при переходе как у тебя на скриншоте должна высыпаться ошибка в консоль, которая тебе должна говорить о том, что ты делаешь чтото не то)
???????
Я крайне советую сделать именно 3 отдельных MaterialApp в main.dart
???????
под загрузку, логин и штатную работу
???????
показало себя отлично, в том числе и в вебе
dmitry isachenkov
Так у меня не в корне) у меня это в виджете Логина , который является роутом именнованым
???????
Виноват, не разгледел, но это все одно хрень)
???????
Авто навигацию в дерево виджетов засовывать - такое себе решение.
???????
Лучше отдельно в сторонке поток состояний через where послушать
RЯ
[
{
"type": "link",
"text": "https://www.didierboelens.com/2018/12/reactive-programming---streams---bloc---practical-use-cases/"
}
]
RЯ
вот этот чувак так не думает
dmitry isachenkov
Да это понятно, я поэтому и спросил, те херачить навигацию в initState в в лисенере моего стрима?)
dmitry isachenkov
Отсюда я и взял пример)
???????
А я не думаю что он хороший пример подает)
dmitry isachenkov
Плюсую, выглядит не очень
???????
То о чем я говорю, позволит решить ооочень много проблем из одного места, включая смену тем оформления приложения
RЯ
да с блоком много чего выглядит не очень
RЯ
стримбилдер решает так же это все
RЯ
и ребилдить что нужно)
???????
чтоб слушать стрим - сделан listen, внезапно
???????
а стримбилдер сделан чтоб строить виджеты
RЯ
а русский язык чтобы придираться к словам
dmitry isachenkov
Строить виджеты на основе того что пришло из сстрима
???????
Я не придираюсь. Вам показать как это работает на боевом приложении с google oauth2 аутентификацией в флатер вебе?)
???????
Чтоб не думали, что я теоретизирую)
???????
Лисн, естественно. Буквально 1 лисн управляет потоком загрузки, авторизации и смены тем.
???????
в строчку кода (разнесенную на 5)
???????
Без костылей и пердолинга. Причем крайне очевидно)
Александр Котков
Ахахаха я проорался с фразы??
Александр Котков
На стену вешать как девиз
Александр Котков
Без костылей и пердолинга??
dmitry isachenkov
те вот это православный варик типа?
???????
Я много на этом шишек набил, причем мне довольно важна оптимизация и архитектура. Тк планирую абсолютную кроссплатформу. Костыли сбоку присерать при такой хотелки - прям совсем не вариант.
RЯ
то есть вместо стримбилдера использовать listen и setState это не костыли?
???????
Если вам не нужно строить виджет - это то, как и должно быть, причем единственно верное решение.
???????
[
{
"type": "pre",
"text": "// Слушаю блок настроек на предмет изменения настроек\nappBloc.settingsBloc.state\n.where((SettingsState state) => state is SettingsUpdated)\n.listen((_) {\n if (this.isLoaded && this.isAuthorized) {\n setState(() {\n print('Настройки изменены.');\n });\n }\n});",
"language": ""
},
"\nПримерно так для обновления настроек"
]
???????
[
{
"type": "pre",
"text": "// Слушаю поток состояний приложения, на предмет подготовки приложения к рабочему состоянию\nappBloc.state\n .firstWhere((AppState state) => state is CompleteInit)\n .then((_) {\n setState(() {\n print('Загружено - меняем экран.');\n this.isLoaded = true;\n this.isAuthorized = this.appBloc.currentUser != null;\n });\n }\n);",
"language": ""
},
"\n\nВот для инициализации приложения."
]
dmitry isachenkov
я имею ввиду, норм ли кидать лисенер в initState через delayed
???????
К сожалению у меня тут нет последней версии, там где потоки объеденены
???????
Даже звучит как костыль)
RЯ
через addPostFrameCallback если нужен контекст живой
???????
Объявить прослушку вы можете очень много где. Например в конструкторе вашего State
???????
и оттуда вызывать setState при необходимом условии.
???????
Я убежал. Но использовать виджеты - строители других виджетов, кроме, собственно, строительства этих самых виджетов - яб вам очень не советывал)
dmitry isachenkov
то что доктор прописал
dmitry isachenkov
[
{
"type": "mention",
"text": "@PlugFox"
},
" ",
{
"type": "mention",
"text": "@troubless"
},
" спасибо за помощь"
]
RЯ
только обычно WidgetsBinding вроде юзают)
RЯ
интересно в чем их разница
dmitry isachenkov
внезапно идея не подсвечивает
dmitry isachenkov
[
"я загуглил метод и по первой ссылке получил ",
{
"type": "link",
"text": "https://api.flutter.dev/flutter/scheduler/SchedulerBinding/addPostFrameCallback.html"
},
""
]
RЯ
скриншот кидал с ним даже)
dmitry isachenkov
видимо не заметил
dmitry isachenkov
но через widgetsBinding тоже работает
RЯ
судя по всему это вообще одно тоже
Slava Marchenko
Костыль Фокс показывал 100%. Для этих дел есть стрим билдер, а на листен можно повесить навигацию например
???????
Так ему навигация и нужна. Нафига строить текст "внимание, идет перемещение на следующую страницу. Займет 25 мс." Чтоб помигать и эпилепсиков убить? Или чтоб навигация была глубоко закопана в дереве интерфейса?)
???????
Лан, живите как знаете)
Александр Котков
Можно как то запушить новый экран внутри вкладки боттом бара так чтобы запушенный экран был под боттом баром?
Andrey Gaysin
Всем привет! А у кого-нибудь есть пример приложения, который использует Bloc?
dmitry isachenkov
есть чел на ютубе, у него вроде нормальные примеры
dmitry isachenkov
[
{
"type": "link",
"text": "https://www.youtube.com/watch?v=kWbighSj7V8&list=PLJbE2Yu2zumDqr_-hqpAN0nIr6m14TAsd&index=69"
}
]
dmitry isachenkov
в чем плюс, что у него есть реп на гитхабе, к урокам, и если не хочется смотреть видосик, можно сразу код чекнуть
dmitry isachenkov
сылка на весь плейлист с уроками
dmitry isachenkov
[
{
"type": "link",
"text": "https://www.youtube.com/playlist?list=PLJbE2Yu2zumDqr_-hqpAN0nIr6m14TAsd"
}
]
Andrey Gaysin
Спасибо! Обязательно посмотрю, буду разбираться!
Де Ржусь
ты че тут забыл?
dmitry isachenkov
а ты чо?!)
dmitry isachenkov
читаю, вдохновляюсь и прочее))
Де Ржусь
понял понял ) неожидал тут тебя увидеть )
???????
Привет. Так ведь во flutter_bloc куча примеров
Farid
а гугл на IO provider рекомендовал вместо bloc, rx? или это не то?
dmitry isachenkov
а вообще есть большой резон юзать flutter_bloc и rxdart
dmitry isachenkov
по моему и без ник все работает норм
dmitry isachenkov
или это пока маленький апп норм?)
Alexandra Lutikova
[
"Привет! А может кто-нибудь сталкивался с ошибкой swift stdlib tool: error: The specified item could not be found in the keychain. ? \n\nВот мой вопрос на stackovweflow: ",
{
"type": "link",
"text": "https://stackoverflow.com/questions/56257118/swift-stdlib-tool-error-the-specified-item-could-not-be-found-in-keychain"
},
" \nЕсли вкратце, то я добавила в проект модуль, написанный на swift, добавила в podfile все необходимые строчки, но все перестало билдиться ?? \n\nОшибка на момент копирования swift библиотек. При этом, на эмуляторе все работает чудесно, а вот на устройстве такая фигня. \n\nЯ перегуглила все, что было по этой теме: \n\nСброс связки keychain, удаление derrived data, бесконечные clean/перезагрузки компа, телефона и xcode, переустановка xcode, измененеие прав на папку с проектом, создание абсолютно нового apple id, пересоздание проекта через flutter create - ничего не помогло. \n\nПри этом, если в xcode создать чистый swift проект, то он билдится без проблем"
]
???????
БЛоК это и архитектура приложения и способ реализации Событие->Состояния. К томуже у БЛоКа под капотом все полностью на rxdart, если что.
Alexandra Lutikova
Понятно, что это больше про ios, чем про флаттер, но вдруг кто-то такое уже решал.
???????
Ну смотря что ты там делаешь. Но есть предположение, что у тебя просто костыль на костыле, а это вообще не заметно когда у тебя единая логика и 1-3 экрана. Пару экранов можно целиком на stateful виджетах и setState сделать, ни о чем не парясь. Но захочешь смасштабировать - спагетти код тебе этого не даст.
Kherel
а scoped model уже отошел да, все переходят на block?
Andrei G.
А есть какое то сравнительное описание существующих архитектурных паттернов ддя флаттера, что бы можно было выбрать наиболее подходящий для своего будущего приложения?
dmitry isachenkov
самый приятный редукс
dmitry isachenkov
на мой сугубо личный взгляд)
Andrei G.
Я жава бэкендер, для есть что?)))
dmitry isachenkov
редукс)
???????
Просто тут такие слова не говорят.
???????
[
{
"type": "link",
"text": "https://habr.com/ru/post/438574/"
}
]
|