Я нашел решение, и оно прекрасно работает, но сначала несколько слов о вышеупомянутом:
Hero не вариант, потому что он не поддерживает все типы навигации, например, pushReplacement и у меня была ошибка с анимацией в моем NavigationBar во время его использования, возможно, потому что у hero есть встроенный анимация тоже.
Решение:
- Я создал новый экран под названием homePage (что-то вроде концентратора для навигации).
- Там у нас есть вещь, называемая PageStorageBucket, которая полезна для хранения состояния на странице, которое сохраняется при переходах от одной страницы к другой. введите описание ссылки здесь
homePage.dart:
Widget newsList;
Widget favorites;
Widget profile;
Widget answers;
List<Widget> pages;
Widget currentPage;
final PageStorageBucket bucket = PageStorageBucket();
@override
void initState() {
newsList = NewsList(isFavorite: 0);
favorites = NewsList(isFavorite: 1);
profile = Profile(userID: widget.userID);
answers = Answers();
pages = [newsList, favorites, profile, answers];
currentPage = newsList;
super.initState();
}
Итак, мы добавили несколько виджетов (экранов) в корзину PageStorage, а затем используем их в Scaffold of homePage ... даже для этого есть место.
@override
Widget build(BuildContext context) {
return Scaffold(
body: PageStorage(
child: currentPage,
bucket: bucket,
),
bottomNavigationBar: BottomNavyBar(
currentIndex: currentTab,
onItemSelected: (int index) async {
setState(() {
currentTab = index;
currentPage = pages[index];
});
},
items: [
BottomNavyBarItem(
icon: Icon(Icons.menu),
title: Text('Новости'),
activeColor: Colors.blue,
inactiveColor: Colors.black
),
BottomNavyBarItem(
icon: Icon(Icons.favorite_border),
title: Text('Избранное'),
activeColor: Colors.red,
inactiveColor: Colors.black
),
],
),
);
}
}
Работает отлично.
- homePage Scaffold является постоянным и не перерисовывается при перенаправлении на другую страницу, поэтому мы можем использовать навигационные панели с анимацией и всем остальным.
- Мы можем выбрать, какие страницы будут включены в эту область.
- Мы все еще можем использовать Navigator.push и другие внутри этих экранов
- Можно использовать multi-scaffold, например, когда вам нужны разные панели приложений, просто удалите appBar из homePage, и он будет использовать appBar из открытого экрана.