#flutter #dart #statefulwidget #statelesswidget
#flutter #dart #statefulwidget #statelesswidget
Вопрос:
у меня проблема с Flutter BottomNavigationBar. я создал BottomNavigationBar с 3 элементами, полный код
class TabPage extends StatefulWidget {
@override
_TabPageState createState() => _TabPageState();
}
class _TabPageState extends State<TabPage> {
int _currentIndex = 0;
final Map<int, Widget> _routes = <int, Widget>{
0: MainTab(),
1: NotificationTab(),
2: BlocProvider(
create: (context) => ProfileBloc(DataProvider()),
child: ProfileTab(),
),
};
void _onTabTapped(int index) {
setState(() {
_currentIndex = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
bottomNavigationBar: BottomNavigationBar(
showUnselectedLabels: false,
currentIndex: _currentIndex,
type: BottomNavigationBarType.fixed,
onTap: _onTabTapped,
items: [
BottomNavigationBarItem(
icon: Icon(
Icons.language,
),
label: AppLocalizations.of(context).translate("home"),
),
BottomNavigationBarItem(
icon: Icon(
Icons.notifications,
),
label: AppLocalizations.of(context).translate("notification"),
),
BottomNavigationBarItem(
icon: Icon(
Icons.person,
),
label: AppLocalizations.of(context).translate("profile"),
)
],
),
body: _routes[_currentIndex],
);
}
}
Все работает нормально, если я переключаюсь с одной вкладки на другую, проблема в том, что вкладка не обновляется повторно, если пользователь нажимает на текущую выбранную вкладку. Первая вкладка — это виджет с WebView, поэтому я хочу, чтобы пользователь возвращался к initialUrl, даже если он уже находится на этой вкладке. Кажется, что нажатие на текущую выбранную вкладку не имеет никакого эффекта. Есть ли способ перестроить виджет-потомок?
class MainTab extends StatelessWidget {
@override
Widget build(BuildContext context) {
return SafeArea(
child: WebView(
initialUrl: "https://www.google.com/",
javascriptMode: JavascriptMode.unrestricted,
),
);
}
}
Комментарии:
1. Добавьте ключевой параметр на любую вкладку, которую вы хотите перестроить в _routes. Предоставьте ей уникальный ключ. Это будет перестраивать его каждый раз.
2. Не могли бы вы опубликовать пример, пожалуйста?
Ответ №1:
final Map<int, Widget> _routes = <int, Widget>{
0: MainTab(key : UniqueKey()), // add key to every widget and pass it to super constructor.
1: NotificationTab(key : UniqueKey()),
2: BlocProvider(
create: (context) => ProfileBloc(DataProvider()),
child: ProfileTab(key : UniqueKey()),
),
};