Size: a a a

Dart & Flutter по-русски

2020 November 29

MK

Maks Kravchenko in Dart & Flutter по-русски
Евгений Баладжа
Привет всем! Вроде типичная задача - отобразить фотку на экране. Перед этим проверить соотношение сторон, если вертикальная - отобразить как есть, а если горизонтальная - повернуть на 90%. Как такое решается? Я попробовал сначала создать виджет Image.memory(..), а потом проверить его ширину/высоту, но они null. Пробовал использовать пакет image, но функция decodeImage()  жутко тормознутая - на телефоне 3 секунды (!!). Но ведь эту же задачу сам Андроид решает мгновенно, почему Dart не может? Какие у меня еще варианты?
не уверен на 100% но я бы попробовал следующее:

в виджете хранить угол поворота, который по дефолту равняется 0

в Image прокинуть GlobalKey чтобы можно было получить размеры из RenderBox
например:
final box = keyContext.findRenderObject() as RenderBox;
box.size.height

и в initState в зависимости от соотношения сторон поменять угол поворота
источник

M

MiT in Dart & Flutter по-русски
Евгений Баладжа
Во первых это уже не модно, во вторых у меня server less )
Принцип получения размеров один и тот же для Image.
https://stackoverflow.com/questions/44665955/how-do-i-determine-the-width-and-height-of-an-image-in-flutter
источник

ЕБ

Евгений Баладжа... in Dart & Flutter по-русски
Maks Kravchenko
не уверен на 100% но я бы попробовал следующее:

в виджете хранить угол поворота, который по дефолту равняется 0

в Image прокинуть GlobalKey чтобы можно было получить размеры из RenderBox
например:
final box = keyContext.findRenderObject() as RenderBox;
box.size.height

и в initState в зависимости от соотношения сторон поменять угол поворота
О, спасибо ! никогда с рендер-боксом не работал, хороший повод попробовать!
источник

MK

Maks Kravchenko in Dart & Flutter по-русски
круто, спасибо)
только тут именно в initState нужно получить размеры
источник

ЕБ

Евгений Баладжа... in Dart & Flutter по-русски
Нифига себе. ImageStreamListener это круто, и то что надо без хакинга. Спасибо!
источник

ЕБ

Евгений Баладжа... in Dart & Flutter по-русски
Maks Kravchenko
круто, спасибо)
только тут именно в initState нужно получить размеры
Да не, у меня картинка в билдере загружается, оно и так небыстро, и важно чтобы лишних задержек не было.
источник

MK

Maks Kravchenko in Dart & Flutter по-русски
хотя
источник

M

MiT in Dart & Flutter по-русски
Maks Kravchenko
круто, спасибо)
только тут именно в initState нужно получить размеры
Так а кто мешает? Ваш способ без первого билда не сработает
источник

MK

Maks Kravchenko in Dart & Flutter по-русски
да, лучше через билдер сразу угол определять и не использовать GlobalKey
источник

MK

Maks Kravchenko in Dart & Flutter по-русски
MiT
Так а кто мешает? Ваш способ без первого билда не сработает
initState после первой отрисовки срабатывает если не ошибаюсь
но, как написал выше, вариант с билдером лучше
источник

ЕБ

Евгений Баладжа... in Dart & Flutter по-русски
Maks Kravchenko
да, лучше через билдер сразу угол определять и не использовать GlobalKey
ИМХО, глобалкеи это грязный хакинг, нарушающий всю красоту фукнционального программирования )
источник

M

MiT in Dart & Flutter по-русски
Maks Kravchenko
initState после первой отрисовки срабатывает если не ошибаюсь
но, как написал выше, вариант с билдером лучше
init до отрисовки)
источник

M

MiT in Dart & Flutter по-русски
Maks Kravchenko
initState после первой отрисовки срабатывает если не ошибаюсь
но, как написал выше, вариант с билдером лучше
Чтобы он ещё и после отрисовки сработал, нужно повесить специальный callback
источник

MK

Maks Kravchenko in Dart & Flutter по-русски
источник

MK

Maks Kravchenko in Dart & Flutter по-русски
разве не значит, что initState после первой отрисовки срабатывает?
источник

M

MiT in Dart & Flutter по-русски
Maks Kravchenko
разве не значит, что initState после первой отрисовки срабатывает?
Нет, это значит что виджет (элемент) был добавлен в дерево
источник

M

MiT in Dart & Flutter по-русски
Поставьте принты и просмотрите
источник

MK

Maks Kravchenko in Dart & Flutter по-русски
а, точно)
чтобы после первой отрисовки выполнить что-то надо addPostFrameCallback юзать
источник

V

Vyacheslav in Dart & Flutter по-русски
привет всем! На сервер файлы раньше загружались через http://resumablejs.com/
Посоветуйте, как на флаттере написать аналогичный upload? чтобы не переделывать бэк
источник

V

Vadim in Dart & Flutter по-русски
Maks Kravchenko
а, точно)
чтобы после первой отрисовки выполнить что-то надо addPostFrameCallback юзать
Ещё есть didChangedDependencies, который вызывается после initState, и в котором доступен контекст
https://api.flutter.dev/flutter/widgets/State/didChangeDependencies.html
источник