Как в Flutter если я поставил лайк в посте сделать так, чтобы в том же посте на сосденей странице TabBarView он тоже поставился?
У меня есть лента из двух разделов, куда с сервера подгружаются посты. Одна лента для друзей, вторая с рекомендациями. Вся эта страница называется FeedScreen и имеет 2 переменные, заполняемые с сервера
List<UserMultimediaPost> _userPersonalFeed = [];
List<UserMultimediaPost> _userRecomendtaionFeed = [];
Эти две переменные выводятся в PageView.builder все на той же странице FeedScreen вот так:
TabBarView(
children: [
PageView.builder(
scrollDirection: Axis.vertical,
physics: const BouncingScrollPhysics(),
itemCount: _userPersonalFeed.length,
itemBuilder: (context, index) {
return FullScreenPost(postItem: _userPersonalFeed[index]);
}
),
PageView.builder(
scrollDirection: Axis.vertical,
physics: const BouncingScrollPhysics(),
itemCount: _userRecomendtaionFeed.length,
itemBuilder: (context, index) {
return FullScreenPost(postItem: _userRecomendtaionFeed[index]);
}
),
]
)
Внутри FullScreenPost экземпляр поста, где фото и лайк заполняется из модели UserMultimediaPost, отправленной в билдере PageView.
Если я ставлю лайк на первой странице TabBarView, то, естественно, на второй он не ставится. Я провел отладку и заметил, что ребилд у FeedScreen и у FullScreenPost происходит абсолютно каждый раз, когда я свайпаю PageView. Я решил, что если перед ребилдом я глупейшим способом (FullScreenPost вызывал колбэк к FeedScreen через делегат метода, переданный через конструктор от FeedScreen к FullScreenPost. Таким образом FullScreenPost мог вызывать метод у FeedScreen, где передавал новое кол-во лайков) поменяю обе переменные _userPersonalFeed и _userRecomendtaionFeed таким образом, чтобы у обоих один и тот же пост сменил кол-во лайков на принятое от FullScreenPost, то ребилд произойдет с новыми данными, но как бы не так. Этого не произошло. Если изменять через setState на странице FeedScreen любую из переменных, например _userPersonalFeed, то страница не перерисуется с новыми данными. Да и способ тупой.
Дальше я стал читать про пакет Provider. Но я понял, что он нужен для передачи данных из одного виджета к другому дальнему по иерархии виджету напрямую, а не через конструктор (типа VueX в Vue.js). А мне то надо на одной и той же странице имея две List переменные с данными перестроить PageView так, что бы в обоих были актуальные данные. Изменяется один лист, пусть изменится второй, если в нем есть такой же пост.
Я еще подумывал про то, чтобы переподгружать с сервера данные по новой при переходе с одной страницы TabBarView на вторую, но вдруг у человека 2G с тремя палками? Он будет ждать актуализированные данные с сервера всякий раз, когда будет переходить по страницам TabBarView, а этот вариант не подходит.
Следующий шаг: я подумал соединить переменные _userPersonalFeed и _userRecomendtaionFeed в одну. Но какой смысл, если лайк ставится на другом виджете - FullScreenPost, а эти две переменные находятся на FeedScreen. Все равно во-первых, придется передавать новые данные вверх по иерархии через функцию, а это по-любому плохо, и во-вторых, setState переменных _userPersonalFeed и _userRecomendtaionFeed не перерисовывал с новыми данными новые FullScreenPost.
Дальше я решил сделать еще одну глупость. Вместо
itemBuilder: (context, index) {
return FullScreenPost(postItem: _userRecomendtaionFeed[index]);
}
я сделал
List<FullScreenPost> posts = [];
...
itemBuilder: (context, index) {
FullScreenPost post = FullScreenPost(postItem: _userRecomendtaionFeed[index]);
posts.add(post);
return post;
}
И я думал, что таким образом буду иметь доступ ко всем нарисованным виджетам и смогу изменить их состояние. Но погуглив, я нашел не рабочие post[i].getState().refresh(). Да и в целом сам посидел пол дня и не нашел как залезть в состояние виджета вот так. И конечно же этот способ тоже тупой и я бы не хотел его использовать.
В общем-то, если есть где-то на гите исходники с решением этой проблемы, может быть есть где-то бест практики почитать, может вы знаете как такое решить. Напишите где изучить, дайте наводку, может покажите как. Спасибо