Перестроить ту же вкладку с помощью Flutter BottomNavigationBar

#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()),
    ),
  };