Программирование : Dart & Flutter по-русски
???????
По идее от listen также не надо. Почти все методы стрима - шоткаты к listen
Dmitriy
ага... как стримконтроллер значит. ну тогда поидее GC сам почистит ресурсы
???????
Да, блок версии 3.Х.Х наследуется от Stream и StreamSink
tdesc
если в коллбеке «ничего такого» то ненада, а так может стрельть когда не нада
???????
[
{
"type": "mention_name",
"text": "Dmitriy",
"user_id": 398493089
},
" \n",
{
"type": "link",
"text": "https://stackoverflow.com/questions/49879438/dart-do-i-have-to-cancel-stream-subscriptions-and-close-streamsinks"
}
]
???????
Ну это считай можно про любой метод стрима сказать) Яж говорю, почти все что у него есть - это просто шоткат к listen)
Compote
Если я инициализирую внутри блока контроллеры или слушаю какую-то подписку.. я ж должен потом вручную все это закрывать?
Andrey Eremenko
ну тогда стор не нужен, такие временные данные вполне можно хранить в репозитории, называя это "кэш". итак, мы получили откуда-то новый объект юзера. мы не знаем: это обновленный объект имеющегося в приложении юзера или вообще новый или старый не измененный. кинули его в блок User. допустим, блок User хранит в своем сторе информацию о текущем юзере. Сравниваем его с новым. Видим что что-то изменилось - кидаем во вьюху новый стейт с обновленными данными юзера. Так?
tdesc
если вы один то не нужен. ???>? у меня в среднем 8 человек трудится + паралельно white label пилится с полностью другим бэком
Evgenii Elchev
вы про разные вещи говорите) андрей хочет что бы стор очищался от неиспользуемых данных, а ты говоришь ему что надо что бы они там лежали. Очевидно что технически это разные решения
Evgenii Elchev
и идея общего стора (редакса) в том что бы данные именно хранились в нем, так что нужен он андрею или нет может только андрей решить
Evgenii Elchev
ибо тема архитектурная и холиварная
Evgenii Elchev
а так ты прав, что блок не про стейт менеджмент, это про бизнеслогику. И стейт при этом ты можешь хранить как хочешь, хочешь в общем сторе, хочешь кэшируй в блоке, хочешь кэшируй в репозитори, хочешь вообще не кэшируй
Evgenii Elchev
надо просто это хэнлить корректоно в зависмости от выбранной стратегии
Andrey Eremenko
вот я как раз хотел его заменить блоком. то есть не хранить данные, а реактивно обновлять новыми. пусть все данные храняться где-нибудь, где они могут быть безопасно удалены. например, в блоке.
???????
Не стоит в блоке хранить данные
Evgenii Elchev
а в чем вопрос? хочешь храни в блоке
???????
Лучше храни в провайдере/репозитории
???????
Будет и чище и кэширование у тебя само собой получится
Evgenii Elchev
а если тебе от одного провайдера разные кэши нужны в разных блоках?)
???????
Так тыж инстанс этого провайдера создаешь
Dmitriy
И инстанц синглтон, должен быть
Evgenii Elchev
а что если тебе надо что бы в двух блоках был один кэш, а в третьем другой?
???????
Очевидно создам провайдер с одинаковыми настройками
Evgenii Elchev
короче it depends
???????
В любом случае пихания говна в блок этого не решает
Evgenii Elchev
только кэш там будет разный, ибо это разные провайдеры, если ты конечно вынесешь кэш в отдельный объект и не скормишь его двум провайдерам
Dmitriy
Получается, например, если есть у меня объект "Profile". и он мне нужен в 3-4 блоках сохранить его в репозитории, а у же в блоках, через него доставать кешированный объект?
???????
Ну смотря что у тебя за "настройки"
Evgenii Elchev
ну о том и речь
Evgenii Elchev
кэш может лежать где угодно в завмисмости от потребностей
???????
Ну я тебе говорю о том, что скажем если ты провайдеру передаешь имя условной таблицы или файла или ресурса
???????
То даже два разных инстанса будут иметь один доступ
???????
Или создавая блок ты можешь передавать конкретную ссылку на ресурс/объект и прокидывать её в провайдер
???????
Нет объективных причин держать мусор в блоке
???????
1-2 поля для удобства - мб
???????
Но не более. Это сделает блок монструозным и раздутым.
Evgenii Elchev
когда он у тебя один на проект да
???????
Оставьте ему только обработку эвента в стейты и всо)
???????
и будет по красоте
Яўген
Ребят, как сделать, что бы кнопки для выделения текста автоматически переставали отрисовываться под другим выджетом? Сейчас они на первом плане поверх кнопок отрисовываются...
???????
А данные уже в провайдеры-репозитории
Dmitriy
Чем провайдер от репозитория отличается?
???????
Под этим я имею ввиду провайдер это адаптер к какойто отдельной части, скажем хранение в оперативной памяти, доступ к субд, доступ к http ресурсу, фаербейс. Тобишь вполне себе конкретная цель, вполне себе отдельный ресурс.
???????
А под репозиторием я понимаю набор адаптеров.
???????
Тобишь тебе может захотется настроить более глубокое взаимодействие между провайдерами
???????
Вот скажем, тебе надо получить количество яблоков на складе:
Dmitriy
А может же быть так, что у меня будет несколько репозиториев например: auth_repos. users_repos. something_repos
???????
1) блок получай эвент ДайЯблоков() 2) в мап евент ту стейт он вызывает генераторо получения яблоков 3) возвращает стейт ПолучаюЯблоков() 4) вызывает эвейт Репозиторий.дайЯблоков() 5) в репозитории вызывается хттпПровайдер.дайЯблоковССервера() 6) полученные яблоки пишутся в локалПровайдер.схороняйЯблокиВКэше() 7) возвращаются в блок полученое количество 8) блок генерирует стейт ЯблокиПолучены()
Константин Буланов
У меня вот такой
???????
[
"И тут ты такой: а интернет то у меня не всегда будет, да и оперативное получение яблоков мне не нужно, достаточно информации +- день.\nИ между шагом 4 и 5 втыкаешь ",
{
"type": "code",
"text": "локалПровайдер.получиЯблокиИзКэша()"
},
""
]
Dmitriy
Ок. если я работаю с фаербейзом то могу я напрямую работать с ним внутри репозитория не создавая отдельно провайдера.
Павел
Ты из программы бета-тестеров?
???????
И по сути от блока требуется хранить только инстанс репозитория и запрашивать у него Репозиторий.дайЯблоков()
Константин Буланов
Я из программы нубов.
Павел
а зачем бета версия?
Константин Буланов
Знал бы я. Хотел сделать сборку приложения под мак. переключился на какуюто ветку мастер вроде. так и живу теперь.
Константин Буланов
Да и полезно мне наверное. Больше багов будет которые мне придется осознать :)
???????
[
"Переключение между ветками делается как ",
{
"type": "code",
"text": "flutter channel beta"
},
""
]
???????
Есть stable, beta, dev, master
???????
[
{
"type": "link",
"text": "https://github.com/flutter/flutter/wiki/Flutter-build-release-channels"
}
]
Константин Буланов
Я так не делала как вы. Только так flutter channel master. Но я потом спрашивал страшно это или нет. Сказали норм.
Dmitriy
Я понял, что делать отдельные провайдеры удобно, например, если я использую сегодня фаербейз, а завтра через апи получать данные. То внутри репозитория ничего не изменится, кроме как ссылки на другой провайдер получается
Константин Буланов
Кстати спасибо большое за помощь с BloC вроде зашел подход. Теперь не надо изобретать фьючебилдеры левые. Хреново только то что все примеры в интернете разные. Делаются в разной логике и там куча левых компонентов еще юзается что сбивает с понимания.
Павел
Как в Column выгнать List ? Есть что-то типа foreach и вернуть виджет или ListBuilder только ?
???????
в общем репозиторий это хранилище для в провайдеров
???????
Если также нужно взаимодействовать между ними, а наружу дать только один метод
Dmitriy
Лучше создай отдельный метод, где ты получишь список виджетов, а потом в колонке сделаешь ..._мойСписокВиджетов
Павел
поэтому и заклинило
Dmitriy
Да и еще можно навернуть и сделать абстрактными классами, чтобы никто не зависел от реализации))
Dmitriy Orteney
[
"Еще так можно:\n",
{
"type": "code",
"text": "children: [for (var i in asd) Text(i.toString()),],"
},
""
]
Павел
Во! про это и спрашивал)
Павел
[
"в РН юзаем ",
{
"type": "link",
"text": "List.map"
},
""
]
Dmitriy Orteney
ну мап тоже есть
Dmitriy Orteney
это для случая, когда есть статические виджеты и хочется посередине вывалить из листа
Dmitriy
Можно но не красиво, как по мне выглядит, лучше все таки отдельным методом вынести.
Павел
Это само собой. Мне для понимание, какие есть варианты. Так-то я уже передал прямую ссылку на List
Dmitriy
способов, много, можно извратиться и так сделать ...List.map().toList() и через цикл
Павел
часто во многих языках for самый быстрый
tdesc
отказ от стейт менеджмента плохое решение изначально ???>?
Compote
во фронте не будет столь огромных коллекций, чтоб ощутить сколько-либо значимую разницу от for
tdesc
сколько сейчас за один такт процессор команд обрабатывает?
tdesc
об одной миллиардной речь идет же примерно или больше
Dmitriy
Сейчас современные девайся такие , что даже, если вы где-то накосячили в коде по памяти, вы и не ощутите.
???????
[
"Да, если тебе надо список объектов в список виджетов, то самое удобное это ",
{
"type": "code",
"text": "list.map (...)"
},
""
]
???????
[
"Если надо в этот список не только этот список, то\n\n",
{
"type": "code",
"text": " [\n Text('1');\n ...myList.map(...)\n Text('1');\n]"
},
""
]
???????
Ну и да, напоминаю, что таким образом с Column можете подобрать себе проблем на ровном месте, поэтому заворачивайте в SingleChildListView его
Павел
map в конце .toList() ?
???????
Да, map возвращает Iterrable
???????
Его надо взад в List
Павел
У меня кейс такой. Скрол и внутри GridList. Мне NestedScrollView лишний?
Павел
SingleScroll отпработает с вложенными GridList ?
Павел
Ох на РН это та еще тема)
Павел
Пробрасывается внутрь вложенного слушателя касаний внешний скролл контроллер и тот его временно вырубает
Павел
после окончания скрола активирует внешний скролл опять
admin
Как обернуть контейнер с изображением в BorderRadius , что бы углы были округлённые ??
Кирилл Матросов
тебе не нужен container
Олжас Сулеймен
не обязательно ... нужен Iterable чем лист и является
Олжас Сулеймен
для for in к листу приводить не обязательно
Олжас Сулеймен
но for по индексу только лист
Serge Shkurko
[
"В контейнере ",
{
"type": "code",
"text": "\n\ndecoration: BoxDecoration(\n borderRadius: BorderRadius.circular(8),\n)"
},
""
]
Serge Shkurko
[
"либо же контейнер заменить на \n",
{
"type": "pre",
"text": "ClipRRect(\n borderRadius: BorderRadius.circular(8)\n child: Image(...)\n)",
"language": ""
},
""
]
Nikolay Plotnikov
спасибо. я внимательно вчитался и все выполнил )
Yerassyl
ребят, запускаю приложение открывается и сразу же закрывается, в логах нету никакой ошибки. и снизу индикатор installing вечно крутится
Yerassyl
flutter clean попробовал
???????
Попробуй удалить его с устройства
???????
Тобишь именно поставить, а затем удалить
Yerassyl
удалил, щас заново запускаю
К?ги
У меня точно такая же фигня постоянно вылазить,я удаляю приложение и apk файл с билда вручную устанавливаю
К?ги
Тогда только работать начинает как надо
Dmitriy
Так и не нагуглил, при открытии экрана, чтобы ListView прокручен был уже в конец ?
Dmitriy
Для скролл-контроллера можно задать ScrollController _controller = ScrollController(initialScrollOffset: itemHeight * index)
Dmitriy
Насколько валидно инициализировать так контроллер в списке ? `ListView.builder( controller: ScrollController( initialScrollOffset: Dimens.userListSize82px * state.profiles.length - 1), )`
Nikolay Plotnikov
я сделал пробное приложение, для Андроид заплатил. А есть ли какие-то аккаунты для ЭплСтор в складчину может быть. Т.к. что-то не охота платить 100 баксов в код для простого бесплатного приложения.
Evgenii Elchev
не выкладывай)
Nikolay Plotnikov
[
{
"type": "link",
"text": "http://maxoastore.ru/sale/"
}
]
Nikolay Plotnikov
та вот нашел чет
Evgenii Elchev
вообще при жесткой политике банов, общий акаунт это такая себе идея
???????
Индусы так на аппвоке работают) В сто рыл с одного аккаунта рейтинг набивают)
Илья
Привет! Не знаете чатик типо flutter jobs?
Dmitriy
К индусам в аккаунт хочешь записаться))
NewBalanceM5
dart jobs есть
NewBalanceM5
[
{
"type": "link",
"text": "https://t.me/dartlang_jobs"
}
]
Daniil Kolyasnikov
Пиши, у меня есть аккаунт помогу собрать
Evgenii Elchev
в работе как раз интересная вкансия) ты разработчик флаттера? иди к нас курсы по андроид делать ??
Павел
Интересно задал контейнеру height и положил в него GridList - не ограничил по высоте. И контейнер стал выше, прямо к высоте родителя
Павел
Что Fitted надо применять?
Павел
В доках вообще нет свойств height
Evgenii Elchev
звучит странно
Evgenii Elchev
он бы скорее оверфлоу показал
???????
Я сам альфа индус)
Павел
[
{
"type": "link",
"text": "https://i.imgur.com/mNzneRt.png"
}
]
Павел
[
{
"type": "link",
"text": "https://i.imgur.com/rBEjNWv.png"
}
]
Павел
та же тема. А вот если обернуть в Center то норм
Dmitriy
Можете использовать GridView.extent(maxCrossAxisExtent: null) у него есть еще shrinkWrap
Павел
с грид хорошо, но что это за поведение просто двух вложенных контейнеров
Павел
мне сразу кошмары из РН приходят)
Павел
сам движок как буд-то флексовый. Родительский контейнер пытается подстроится под потомка
Павел
но у самого стоит фикс высота
Павел
и получается она перевешивает
Dmitriy
ему нужно constraints: ,задавать
?
Он как будто летит чуть выше, а потом резко опускается
Dmitriy
Так это стандартный переход между скринами
?
т.е не исправить то что он летит чуть выше, а потом резко вниз на несколько пикселей?
Dmitriy
Еще зависит как вы разместили нижнюю кнопку на одном и втором скрине. Можно переход заменить своим кастомным например слева направо
Павел
Разобрался с constraints. Ох сколько тонкостей)
?
А причём здесь кнопка? у меня текст в заголовке прыгает немного
Dmitriy
А снизу вы не замечаете, что тоже прыгает?
?
Так снизу просто кнопка выезжает другая, они не анимированы через Hero
Dmitriy
Проще всего переделать PageTransition на свой на оф сайте есть туториал
?
Та меня переход между страницами особо не волнует, меня волнует то, что название сериала когда идёт переход на второй скрин, летит выше чем нужно, а потом резко вниз на своё место
Артем ??
дерево виджетов внутри Hero различается?
Dmitriy
Так из-за перехода и летит вниз. Переход же идет снижу вверх и обратно
Павел
То что надо указать потомку как сильно ему можно растягиваться к размерам роителя
Павел
пока читаю, но пару экспериментов получил высоту нужную
Павел
constraints: BoxConstraints.loose()
Павел
я думаю что это связан, что у родителя только один потомок
Павел
любой потомок не Container и все на места
Dmitriy
Можно еще попробовать не в контейнер, а в SizedBox или ConstrainedBox
Павел
точно! я все на память не помню
Павел
Скорее всего ConstrainedBox наследуется от Container с constraintes
Олжас Сулеймен
пробовал кто в вебе Worker'ы?
Олжас Сулеймен
как туда передать канвас на рендер?
Олжас Сулеймен
веб на дарте чуть в сторону обычных от форм становится какахой ))
Serge Shkurko
[
"передай в event'e ноду и отрисовывай в воркере\n\n",
{
"type": "link",
"text": "https://github.com/PharJS/pharjs.github.io/blob/master/src/services/phar.worker.ts#L4"
},
""
]
Олжас Сулеймен
валится на таком
Олжас Сулеймен
[
{
"type": "link",
"text": "https://developers.google.com/web/updates/2018/08/offscreen-canvas"
}
]
?
Сделал переход с помощью FadeTransition, текст всё равно летит выше, а потом вниз
Артем ??
звезда же тоже внутри другого Hero?
Артем ??
хорошо бы видеть структуру
?
Это так сказать SerialTile)
?
если включить аватарку, эффект будет тот же
?
у текста, аватарка и звезда идеально перемещаются
admin
О большое спасибо ) это помогло )
Dmitriy
Вас не устраивает, что текст немного подпрыгивает?
Dmitriy
Не в дебаг режиме пробовали запускать?
?
в дебаг режиме анимации не видно) это релиз версия)
Александр Саньков
вангую, что это из-за того, что текст в материал обернут
Vladimir Brejcha
Ребята, кто работал с FlutterFirebaseMessagingService (пуши), были с ним огромные проблемы и спустя два дня дебага мы выяснили что он запускает onBackgroundMessage в отдельном изоляте, соответственно само приложение запускается в другом изоляте и данные не шарятся, кто-нибудь работал над подобными ситуациями?
Dmitriy
Мне придется, попозже с этим возиться.
Rinat Kurmashev
Я пытался разобраться с бэкграунд сообщениями, но в итоге забил и закомментил
|