Программирование : Dart & Flutter по-русски
???????
Или переменная была константой
Roman Vasiliev
вот что ограничивает функцию, а в функции я хочу создавать объект с передачей в него этой переменной
Evgenii Elchev
Есть причина почему ты не хочешь поместить ее какой нибудь класс?
Roman Vasiliev
изначально была в классе, но теперь по видимому не будет)
???????
Возьми get_it какойнить, если у тебя сплошь и рядом такое случается
Evgenii Elchev
Так причина то есть если нет?)
Evgenii Elchev
Ну обычную переменную в сервис локатор класть совсем не айс
Roman Vasiliev
да, плееру нужен бэкграунд, он на изолятах (это все либа), изолятам нужна кастрированная функция топ-левел или статик (ограничивает функция со скрина), в такую я смогу передать переменную только с топ-левела
Evgenii Elchev
Чёт там вроде не так это работает
Roman Vasiliev
через статический хелпер этой барагозы (либы) можно передать только примитив, не годится
???????
Эм, ты вообще все не так как то делаешь
Roman Vasiliev
ну там я уже не хозяин барин)
Evgenii Elchev
Ты можешь передавать любые аргументы в функцию которую суёшь в compute
???????
К томуже если твой "бэкграунд" это файл
???????
То в изолятах не стоит передавать как переменную
Evgenii Elchev
Короче, эту твоя причина не причина, а недопонимание стандартной библиотеки. Если я все верно конечно понял
Roman Vasiliev
бэкграунд - работа плеера в свернутом состоянии, то что с уведомлением работает
Roman Vasiliev
из стандартной библиотеки там только получение хендла функции
Roman Vasiliev
и то оно внутри, ну типа оно меня и подсирает
???????
Если даже тебе кажется, что надо переменную - сделай её геттером/сеттером
Evgenii Elchev
Ну там дженерик же, компьюте принимает функцию, а потом список аргументов, для этой функции
???????
[
"Ну и просто на всякий, если передаешь файлы там, не передавай через переменные\n",
{
"type": "link",
"text": "https://api.dart.dev/stable/2.8.0/dart-isolate/TransferableTypedData-class.html"
},
""
]
Evgenii Elchev
Это тоже атавизм из джава. Геттер/сеттер должен создавать если нужен, а не просто потому что это лучше обычной переменной
???????
Очевидно это лучше чем переменная
Evgenii Elchev
Чем? Тем что кода больше?
Roman Vasiliev
не, вы меня неправильно поняли, вот функция которая берет в библиотеке хендл моей передаваемой функции, в комментарии указано что и как она работает, это мне и мешает. файл из dart.ui
Roman Vasiliev
хендл для работы между изолятами, как я понял
Roman Vasiliev
это все меня заставляет выносить переменную из класса наверх
Evgenii Elchev
А переменная _forwardCache?
Roman Vasiliev
нет, скрин из либы вообще моя переменная это контроллер аудио, мне нужно будет за ним следить как изнутри (таска который будет работать в изоляте), так и снаружи (там где объект контроллера создается)
Roman Vasiliev
изнутри еще дергать его будет
Evgenii Elchev
Пример покажи, ничего не понятно
Roman Vasiliev
так вот, я не могу никак этот контроллер внутри класса, где он создается оставить, так как ограничка на топ-левел или статику коллбэка
Evgenii Elchev
В либе вот юзают глобальный кэш, и это в целом ок, в каком то роде, но могли бы его и аргументом передавать, было бы гибкое решение и трестируемое
Evgenii Elchev
Ещё раз, ты можешь в функцию передать любую переменную в качестве аргумента, и эта переменная не обязательно должна быть глобальной
Roman Vasiliev
[
"Либа ",
{
"type": "link",
"text": "https://pub.dev/packages/audio_service"
},
"\n\nКоллбэки таска дергаются через статику вспомогательного класса либы\n\nКонтроллеры создаются в PlayerBloc и присваиваются переменной только там\n\nНа втором и третьем скрине коллбэк с созданием таска и как он юзается"
]
Roman Vasiliev
меня ограничивают топ-левелом или статикой, я не могу задать функцию "на месте"
Roman Vasiliev
а ну прекрасно, контроллер я и не получаю в коллбеке дарт приучает к правильному кодингу??
Evgenii Elchev
У тебя тут все несколько сложнее, потому что ты используешь методы библиотеки а, не просто compute, надо смотреть какое апи она предоставляет
Evgenii Elchev
Но опять же, если там изолят, то функция не будет работать с глобальной переменной, потому что изолят не имеет доступа к памяти вне себя
Roman Vasiliev
это я уже познал, ну окей эта проблема решилась, появилось две другие, буду думать
Вадим
Ребят, подскажите, пожалуйста.Flutter подойдёт для совсем начинающего? Цель освоить программирование чтобы полноценно понимать проекты с которыми работаю.
???????
Тут очень много сложных концепций.
???????
Попробуй для начала просто дарт
Roman Cinis
я бы добавил что без инглиша вообще не стоит начинать, если есть такая проблемка
?? Назар Калитюк
особенно дарт и флаттер, где на русском нифига нету. Хотя хоть на англ есть и уже хорошо
Roman Vasiliev
но то, что есть на английском, весьма хорошо
roman G ??
есть вот такой диалог, он вызывается при ошибке собственно проблема в том, что если поймать момент и закрыть текущий экран во время того как диалог должен быть показан, то диалог показывается на другом экране, как такое можно избежать?
?? Назар Калитюк
я новичек в флатер, но думаю у виджета должен быть хук onDestroy или что то вроде. Вот в нем в текущем экране нужно алерт закрыть/удалить
?? Назар Калитюк
dispose наверное
???????
Диалог закрывается через pop
Сергей Переходов
ты говоришь о dismiss?
?? Назар Калитюк
ну как я понял нужно закрыть диалог при закрытии страницы, если диалог есть.
roman G ??
ну, проблема в том, что диалог показывается уже после вызова dispose либо в момент, там есть 0.3 сек чтобы воспроизвести эту проблему
roman G ??
т.е пользователь нажал кнопку именно в момент начала показа диалога если за секунду до, то диалог просто не показывается
Roman Vasiliev
Дак он 'должен быть показан' или что? Вообще-то у навигатора стэк и если верить в чудеса, то закрыться должен диалог, а не экран, так как диалог будет последним в стэке
roman G ??
если пользователь нажал кнопку назад, то диалог не должен быть показан
???????
[
"Зацените новый капетик)\n",
{
"type": "link",
"text": "https://pub.dev/packages/multiline"
},
""
]
roman G ??
[
"в консоле пишет: \n ",
{
"type": "pre",
"text": "To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.",
"language": ""
},
""
]
Roman Vasiliev
[
"Я так понял, что вызывается showDialog в котором ",
{
"type": "italic",
"text": "push"
},
" диалога, ",
{
"type": "bold",
"text": "затем"
},
" с очень коротким таймингом, достаточным (вряд ли) для нажатия кнопки назад, происходит закрытие экрана, который вызывает ",
{
"type": "italic",
"text": "pop"
},
" навигатора.\nЗакрывается экран, который не в топе навигатора, что за чудеса?"
]
ilx13
Добрый вечер ребята. Никто не встречал виджет типа cupertino switch только не 2 значениями а 3. понятное дело не булевое а например как значения получал инт.
Игорь
Привет, ToggleButton посмотри, вроде то, что тебе нужно
Alexander S.
пхпшника видно из далека)
Trouble Shot
Всем привет!
Trouble Shot
А кто-нибудь хоть раз использовал 3D модели внутри Flutter приложения?)
Trouble Shot
Я просто пытался найти хоть какие-нибудь примеры) Хотя бы форматы понять какие кушает изначально
Trouble Shot
А то вроде есть на C4D разные модели которые в Свифт раньше конвертили) А тут как-то не разобрался еще)
Nikita Domnitskii
Кто-то вьюшку с юнити запихивал
Pavel Vasilenko
[
{
"type": "link",
"text": "https://pub.dev/packages/flutter_3d_obj"
}
]
Trouble Shot
Павел, благодраю, пойду почитаю)
Pavel Vasilenko
Но вроде пишут, что работает очень медленно и сделано просто для демонстрации
Trouble Shot
Не нашел в правилах чата, вроде можно. Если есть кто работу ищет, пишите в личку (Flutter/Dart - Mob.App.Dev нужен)
Trouble Shot
Да, прочитал уже. Что там не пришей к одному месту рукав.
Rinat Kurmashev
[
{
"type": "mention",
"text": "@dartlang_jobs"
}
]
Олжас Сулеймен
[
{
"type": "link",
"text": "https://pub.dev/packages/flutter_cube"
}
]
Олжас Сулеймен
[
{
"type": "link",
"text": "https://pub.dev/packages/flutter_unity_widget"
}
]
Олжас Сулеймен
он сам на холсте полигоны рисует, хотя во флаттере для них есть метод
???????
Коту в личку пиши, опубликует вакансию
Alexander Maverick
А где ты его вызываешь? Откуда context? Bloc listener?
Вадим
Господа, кто имел опыт использования Куда shared_prefs сохраняет данные для веба?
???????
Local storage идеальное для них место
Kirill Malev
secured_storage использовал
???????
В вебе нет такого хранилища
???????
есть session/local storage
Kirill Malev
сорян, не увидел контекст
???????
Есть deprecated WebSQL
Вадим
а какая видимость у этого local storage? разные браузеры ведь не могут из одного и того же хранилища черпать данные?
???????
Так и разные телефоны из одного и тогоже shared_prefs не могут
???????
Довольно странный вопрос, если честно)
Roman Vasiliev
И разные пакеты из одного и того же не смогут
???????
Хочешь хранить в целом для пользователя, а не сессии - организуй хранение на сервере + кэш
???????
Это, вроде, супер очевидно
Павел
Кто помнит как правильно переход сделать на новый экран. Апбар должен остаться на месте или всунуть его в новую страницу чтобы въехал снизу целой страницей?
Павел
попробовал целой страницей, как-то не смотрится
Павел
[
"хотя в примерах на ",
{
"type": "link",
"text": "flutter.dev"
},
" весь скафолд приезжает снизу"
]
Evgenii Elchev
Это стандартная анимация
Evgenii Elchev
Для материала по крайней мере
Evgenii Elchev
Согласен, что выезжающий навбар был бы красивым решением. Пиши роут, выкладывай в пакет, я даже лайк поставлю)
Павел
просто в дебаг режиме въезжает уже с заполненным title и весь апбар и кажется как не то что-то. Попробовал чтобы въезжало только body - тоже не понятно)
Павел
может в прод режиме анимация плавнее пройдет
Evgenii Elchev
Пойдёт, но стиль то не изменится
Павел
понял еще почему! У меня прозрачный он по дизайну
Павел
кстати насколько я понял Navigator гибридный. На ios он отработает как положено на ios
Sergey Hottabych
[
"что за глюк pubspec?\nЯ прописываю шрифты\n",
{
"type": "pre",
"text": " fonts:\n - family: Lato\n fonts:\n - asset: assets/fonts/Lato-Regular.ttf\n - asset: assets/fonts/Lato-Bold.ttf\n weight: 700\n - family: Anton\n fonts:\n - asset: assets/fonts/Anton-Regular.ttf",
"language": ""
},
""
]
Sergey Hottabych
выдает следующую ошибку
Sergey Hottabych
Всё, я разгадал. Виной всему отступы. Слово fonts начинается не с начала строки, а после табуляции - yaml уже не понимает, что это такое
???????
И можешь попробывать google_fonts капетик
???????
Lato там вроде есть
Sergey Hottabych
Спасибо, не знал про такой!
Evgenii Elchev
Нет. Не как положено. Он тоже будет со страницей выезжать. Это надо купертино использовать
???????
Как раз только только вышел в 1.0.0
Sergey Hottabych
А то задолбался уже каждый шрифт ручками прописывать
Павел
я говорю не про МатериалАпп а чистый navigator
???????
Там вроде куча годноты
???????
Включая отложенную загрузку и кэширование
???????
Сам еще не пробывал
???????
Но они его презентовали на флатер интеракт
???????
А только только он вышел в 1.0.0
???????
Так що можешь писать '>=1.0.0 <2.0.0' в пабспеке
Evgenii Elchev
В первый же день)
Tagir
Как вызывать init state каждый раз, когда нажимается на bottom tab bar ?
Davron Asrorov
Никак? Init state для этого не презназначен
Davron Asrorov
Но на самом деле можно ключ обновлять, но это не комельфо
Tagir
А что предназначено ?
Davron Asrorov
Init state кнопки?
Roman Vasiliev
а зачем собственно его вызывать?
Tagir
Чтобы подгрузить данные из shared preferences
Roman Vasiliev
код можно вынести в отдельную функцию и вызывать откуда хочется
Rinat Kurmashev
[
{
"type": "mention",
"text": "@PlugFox"
},
" у тебя блоки вообще пустые получаются? mapEventToState состоит типа из event.process()?"
]
???????
Но я все еще думаю как разрулить и сделать это удобнее
???????
Возможно вынесу эти дела в репозиторий
???????
Или придумаю какойнить роутер, чтоб оформлять это дело в виде пайплайна или хэшмапы.
Rinat Kurmashev
а event не может через yield* прокинуть несколько стейтов? или оно так не работает?
???????
yield* вызывает генератор
???????
А генератор уже возвращает от 0 до бесконечности неких значений
Rinat Kurmashev
а почему тогда не сделать как я описал?) не завязываясь на if (event is ..)?
???????
ты предлагаешь вынести реализацию в сам Event?
Rinat Kurmashev
нюансы есть?
Rinat Kurmashev
ну как вариант
Rinat Kurmashev
я думал ты про это и говорил))
???????
Это meh, тк Event и State это модели
Rinat Kurmashev
видать не так понял
Roman Vasiliev
Почему не switch?
???????
[
"Switch работает только с константами\n\n(",
{
"type": "code",
"text": "Switch statements in Dart compare integer, string, or compile-time constants using =="
},
")"
]
???????
Вроде дартовцы хотели это дело поправить
???????
Ну и ты должен понимать event is RightEvent это не тоже самое, что и event.runtimeType == RightEvent
???????
Так что switch, к большому сожалению, здесь не годится
Roman Vasiliev
Ну да, у меня по вложенной константе
Вячеслав
Хочу разобраться с OAuth2 на flutter, но никак не могу найти годных примеров реализации Есть кто-нибудь, кто шарит в этой теме? или может у кого-то есть хороший материал? (документацию по oauth2 и oauth2_client, естественно, открывал)
???????
Для понимания механизма OAuth2 (особенно если гугловского) - советую начать с Postman'а и OAuth2 Playground гугла
???????
На пальцах за 5 минут это не объяснить и уж тем более не понять.
???????
Playground самый лучший способ врубится, понять что за чем идет
???????
Если традиционный трехногий оаус - то тебе нужен провайдер который предоставляет доступ, твой сервер (которому дается доступ по scope) и собственно сам клиент.
???????
Есть упрощенный двухногий, там только провайдер (гугл например) и твой клиент.
Вячеслав
У меня простой универский проект Нужно создать приложение (в вк или facebook), подключиться к нему и выгрузить список друзей звучит очень просто, но я конкретно засел..
???????
Сори, но это одна из тех тем, на которые не хочется тратить время для разжевывания мимокроку в чяте.
???????
Там сам лучше повозись в плейграунде
???????
Или попробуй их SDK
???????
Не понимая сути - тебе будет ооооооооочень тяжко
???????
Не тот случай, когда не надо подключать голову, банально импортируя левые либы.
Александр Васильев
Union можно сделать Event с помощью freezed_package - тогда будет доступен вам метод-переключатель. Там если что есть orElse
Rinat Kurmashev
да мне не обязательно именно так)
Rinat Kurmashev
но как вариант решения рассмотрю
Яўген
Добрый день. Может кто подсказать, CachedNetworkImage иногда выдает errorWidget, а потом, спустя несколько секунд загружаемую картинку. Выглядит это так: Кидается url Плейсхолдер крутиться Срабатывает errorWidget Проходит 2-3 секунды и показывает загруженное изображение
Rinat Kurmashev
как не игнорить yield идентичного стейта?
???????
[
{
"type": "mention",
"text": "@FRapra1"
},
" продолжаю с Феликсом бороться из за той строчки.\nПока придумал такой фикс в виде миксина:\n\n",
{
"type": "pre",
"text": "void main() {\n // Create state and push it\n final State prevState = const State();\n\n // ... after some time ...\n\n // Create new state.\n // Obviously this is a new State for bloc (but nope)\n final State nextState = const State();\n \n // This condition from BLoC always true\n // '''\n // if (transition.nextState == state) return;\n // '''\n // const State never pass again\n // and always skip!!!\n print(prevState == nextState);\n}\n\n\nclass State with AlwaysDifferent {\n const State();\n}\n\n/// BLoC fix mixin\nmixin AlwaysDifferent {\n @override\n // ignore: avoid_equals_and_hash_code_on_mutable_classes\n bool operator ==(Object obj) => false;\n}",
"language": ""
},
""
]
???????
Я с феликсом за это дерусь уже с месяц
???????
Последнее сообщение в его дискорде опять про это
???????
Можешь поддержать
Rinat Kurmashev
какие у тебя аргументы?
Rinat Kurmashev
мне вот надо пул ту рефреш сделать, который апдейтит пачку блоков
???????
А в целом - вот миксин, который фиксит это поведение для иммутальных стейтов
???????
[
{
"type": "pre",
"text": "/// BLoC fix mixin\nmixin AlwaysDifferent {\n @override\n // ignore: avoid_equals_and_hash_code_on_mutable_classes\n bool operator ==(Object obj) => false;\n}",
"language": ""
}
]
Rinat Kurmashev
и чтоб его финишировать надо знать когда данные обновятся
Rinat Kurmashev
а данные то обычно не особо обновляются в таком случае)
Rinat Kurmashev
ну у меня крутилка и вертится дальше
Fearless Cry
Ну захерач полем таймстемп
Fearless Cry
Вообще должно быть поле isUpdate (или isUpdating я хз)
Fearless Cry
Которое ставится в false после результата
Fearless Cry
Тогда стейты, сюрприз-сюрприз, становятся разными
Rinat Kurmashev
то есть мне при апдейте надо делать yield текущего стейта с измененной булькой?
Rinat Kurmashev
до апдейта с true, после с false?
Rinat Kurmashev
[
{
"type": "mention",
"text": "@PlugFox"
},
" вот товарищ ",
{
"type": "mention",
"text": "@FRapra1"
},
" решения предлагает"
]
Fearless Cry
Ну это смысл стейта же
|