Невозможно изменить страницу в зависимости от состояния

Новичок во Flutter, и я использую нижнюю навигацию для переключения содержимого страницы. На основе отладки состояние установки происходит, когда правильный номер индекса фиксируется и назначается переменной _selectedPage. Тем не менее, как только я перехожу этот код, содержимое страницы остается прежним без изменения содержимого, а значок «Домой» остается выбранным в нижней навигации независимо от того, какой значок я выбираю.

Прокомментированные части, в которых я ожидал разницы при выборе другого значка на панели навигации. Пожалуйста посоветуй.

import 'package:flutter/material.dart';

class LatestFeed extends StatefulWidget{
  @override
  State<StatefulWidget> createState() => LatestFeedState();
}

class LatestFeedState extends State<LatestFeed>{

  @override
  Widget build(BuildContext context) {

    int _selectedPage = 0;
    List pageOptions = [
      Text('one1', style: TextStyle(fontSize: 36),), // Expecting a change but now it always remains on this data. No change even when set state changes to different index.
      Text('two', style: TextStyle(fontSize: 36),),
      Text('three', style: TextStyle(fontSize: 36),),
      Text('four', style: TextStyle(fontSize: 36),)
    ];

    return MaterialApp(
      home: new Scaffold(
        body: pageOptions[_selectedPage],
        bottomNavigationBar: BottomNavigationBar(
          type: BottomNavigationBarType.fixed,
            items: [
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
                title: Text('Home')
              ),
              BottomNavigationBarItem(
                  icon: Icon(Icons.rss_feed),
                  title: Text('feed')
              ),
              BottomNavigationBarItem(
                  icon: Icon(Icons.featured_play_list),
                  title: Text('list')
              ),
              BottomNavigationBarItem(
                  icon: Icon(Icons.settings),
                  title: Text('settings')
              ),
            ],
            currentIndex: _selectedPage, // expecting different icons to be selected based on this index which is being selected in the set state below. Not seeing any change.
            onTap: (int index){
              setState(() {
                _selectedPage = index; // being assigned correctly yet no effect
              });
            },
        ),
      ),
    );
  }
}
1
0
300
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поместите свои _selectPage и pageOptions в initState или вне вашего метода сборки, чтобы предотвратить перестроение всякий раз, когда вызывается setState

int _selectedPage;
List<Widget> pageOptions;
    @override
      void initState() {
        super.initState();
         _selectedPage = 0;
        pageOptions = [
          Text('one1', style: TextStyle(fontSize: 36),), // always remains on this data. No change even when set stae changes to different index.
          Text('two', style: TextStyle(fontSize: 36),),
          Text('three', style: TextStyle(fontSize: 36),),
          Text('four', style: TextStyle(fontSize: 36),)
        ];
      }  

Всякий раз, когда вы вызываете setState, будут изменения, которые заставят виджеты перестроиться. Это означает, что ваш метод сборки будет вызван снова. При вызове _selectedPage снова будет установлено значение 0, а pageOptions[0] всегда будет выбранным виджетом.

Я мог бы попробовать, но немного сбит с толку, почему это сработает. Я хочу, чтобы он менялся, когда я устанавливаю состояние. Разве это не заблокирует данные, чтобы они никогда не менялись?

kar 06.04.2019 22:26

позвольте мне обновить мой ответ, чтобы лучше объяснить, пока вы его попробуете.

nonybrighto 06.04.2019 22:27

Работает, и да, я понимаю вашу точку зрения. Теперь он не инициализируется каждый раз и не возвращается к первоначальным настройкам. Спасибо.

kar 06.04.2019 22:34

Другие вопросы по теме