Size: a a a

Flutter Developers — русскоговорящее сообщество

2020 November 26

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Если мне потребуется показать прогресс, например при инициализации приложения нормальный такой кейс, я блоком возвращаю стейты типа таого:

yield ПроисходитИнициализация(проценты: 25, этап: "Растим грибы после дождя");

(я знаю про что ты спрашиваешь, обожди, это далее)
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Далее, у InheritedWidget и как следствие Provider есть поле shouldUpdate
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Используется оно просто:

bool shouldUpdate: (oldWidget) => identical(user, oldWidget.user) && user == oldWidget.user;
источник

EC

Evgeny Cherkasov in Flutter Developers — русскоговорящее сообщество
Denis Chuvasov
вопрос не в обновить пользователя, вопрос в отображении на UI. Есть у меня репозиторий пользователя. Вот я достал токен из sharedpreferences, пошел с ним на бэк получить данные по пользователю. Тут во первых показываем прогресс, потом если все ок, то показываем приложение дальше, если не ок, то надо показать ошибку и кнопку повторить(возмем легкий вариант нет интернета). Ок по первому кейсу мы пошли дальше. В приложении мы в тулбаре везде показываем фио и к примеру у нас есть профиль пользователя, где мы можем эти данные поменять. На этом экране мы можем зарефрешить(pullToRefresh) данные по пользователю, ну вдруг мы фио изменили через другой клиент. То есть надо показать и данные и прогресс. Тут опять два кейса, все ок, тогда надо в тулбаре изменить ФИО, или ошибка, показываем данные и SnackBar.
Я для подобных кейсов сделал универсальный Data объект, который управляет всеми возможными состояними - начальное, есть данные, ошибка и т.п. И виджет, которому передается этот объект и лейауты для разных стейтов, он сам показывает нужный, слушая Data объект. Вроде удобно получается.
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
🅵🅾️🆇
Используется оно просто:

bool shouldUpdate: (oldWidget) => identical(user, oldWidget.user) && user == oldWidget.user;
Но что если нам надо обновлять только по id, да?
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
либо у User переопределяем == на id, либо переопределяем
bool shouldUpdate: (oldWidget) => identical(user, oldWidget.user) && user?.id == oldWidget.user?.id;
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
У провайдера точно такоеже поле
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Но ты скажешь, я все еще хочу получать уведомления в некоторых местах даже если изменится только имя, а вот репозитории не хочу пересоздавать.
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Окей, привереда, тогда это делается банально через ProxyProvider, ну или промежуточный стейтфул виджет / скоуп, где ты проверяешь что именно именно изменилось и надо ли пересоздать.
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
🅵🅾️🆇
Окей, привереда, тогда это делается банально через ProxyProvider, ну или промежуточный стейтфул виджет / скоуп, где ты проверяешь что именно именно изменилось и надо ли пересоздать.
Ну и подобную ситуацию я предусмотрел в своем виджете для создания блока.
Потому, что у Реми кривульки и нельзя в поле создания значения провайдера слушать другие провайдеры, а как следствие не работает и у Феликса:
https://github.com/dart-side/bloc_lifecycle/blob/main/bloc_lifecycle.dart
Тут вызывается коллбэке создания блока при изменении зависимостей, если не хочешь чтоб он изменился - банально возвращаешь исходный блок.
Ну или можешь создать новый блок, прокинув ему initialState из последнего стейта старого
источник

EC

Evgeny Cherkasov in Flutter Developers — русскоговорящее сообщество
Evgeny Cherkasov
Я для подобных кейсов сделал универсальный Data объект, который управляет всеми возможными состояними - начальное, есть данные, ошибка и т.п. И виджет, которому передается этот объект и лейауты для разных стейтов, он сам показывает нужный, слушая Data объект. Вроде удобно получается.
источник

EC

Evgeny Cherkasov in Flutter Developers — русскоговорящее сообщество
Как то так это у меня выглядит ^^
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Denis Chuvasov
не вижу про несколько зависимостей)) просто что может такое произойти, а почему он так говорит хз, ибо дока говорит, что такого быть не должно.
Вообще дока об этом прямо не говорит.

У тебя подписка на InheritedWidget'ы может быть не только в didChangeDependencies, но и в build, как я показывал выше.
К примеру если ты используешь MediaQuery.of(context) - didChangeDependencies будет вызываться при изменении лейаута.

Но есть один ньюанс:
https://github.com/flutter/flutter/issues/12992
К ниму и отсылает по сути Реми.
источник

4

4NK1R in Flutter Developers — русскоговорящее сообщество
Есть элемент с первого скина. Вроде, выглядит нормально, но что делать, если текст не влазит (скрин в следующем сообщении)? Можно ли отрубить конец многоточием без танцев с бубном? В андроиде такое можно провернуть через android:ellipsise="end". Заранее спасибо!
источник

4

4NK1R in Flutter Developers — русскоговорящее сообщество
источник

AK

Artem Krupp in Flutter Developers — русскоговорящее сообщество
4NK1R
Есть элемент с первого скина. Вроде, выглядит нормально, но что делать, если текст не влазит (скрин в следующем сообщении)? Можно ли отрубить конец многоточием без танцев с бубном? В андроиде такое можно провернуть через android:ellipsise="end". Заранее спасибо!
Text Overflow же
источник

4

4NK1R in Flutter Developers — русскоговорящее сообщество
Artem Krupp
Text Overflow же
спасибо, гляну сейчас
источник

AK

Artem Krupp in Flutter Developers — русскоговорящее сообщество
И текст надо засунуть в Expanded
источник

AK

Artem Krupp in Flutter Developers — русскоговорящее сообщество
Чтобы у него были констрейнты
источник

AK

Artem Krupp in Flutter Developers — русскоговорящее сообщество
И maxLines: 1
источник