Как использовать setState () внутри элемента BottomNavigationBar во Flutter?

Я хочу использовать DropdownButton в элементах BottomNavigationBar. Но невозможно использовать setState (). Я вижу эту ошибку: - Невозможно получить доступ к члену экземпляра setState в инициализаторе. Попробуйте заменить ссылку на член экземпляра другим выражением dart (implicit_this_reference_in_initializer)

А также эта ошибка: - К члену экземпляра numDropdownVal нельзя получить доступ в инициализаторе. Попробуйте заменить ссылку на член экземпляра другим выражением dart (implicit_this_reference_in_initializer)

Вот полный код:

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int _selectedIndex = 0;
  String numDropdownVal = 'One';

  static const TextStyle optionStyle =
      TextStyle(fontSize: 30, fontWeight: FontWeight.bold);
  static List<Widget> _widgetOptions() {
    return<Widget>[
    Container(
      child: DropdownButton<String>(
                                isExpanded: true,
                                value: numDropdownVal,
                                items: <String>[
                                  'One',
                                  'Two',
                                  'Three',
                                  'Four',
                                  'Five',
                                  'Six'
                                ].map((name) {
                                  return DropdownMenuItem<String>(
                                    value: name,
                                    // Your row here:
                                    child: Text(
                                          name,
                                          style: TextStyle(fontSize: 18),
                                        ),
                                  );
                                }).toList(),
                                onChanged: (selectedName) {
                                  setState(() {
                                    numDropdownVal = selectedName;
                                  });
                                },
                              ),
    ),
    Text(
      'Other page',
      style: optionStyle,
    ),
    Text(
      'Another page',
      style: optionStyle,
    ),
  ];
  }

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('BottomNavigationBar Sample'),
      ),
      body: Center(
        child: _widgetOptions.elementAt(_selectedIndex),
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: 'Home',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.business),
            label: 'Business',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.school),
            label: 'School',
          ),
        ],
        currentIndex: _selectedIndex,
        selectedItemColor: Colors.amber[800],
        onTap: _onItemTapped,
      ),
    );
  }
}

person Ruchira    schedule 16.02.2021    source источник
comment
Можете ли вы также добавить свой код?   -  person Deepak Lohmod    schedule 16.02.2021
comment
Есть и другие ошибки. Я изменю вопрос.   -  person Ruchira    schedule 16.02.2021
comment
Если бы вы могли представить суть с образцом, возможно, мы сможем помочь вам в достижении ваших целей :-)   -  person Mark Mooibroek    schedule 16.02.2021
comment
@DeepakLohmod, пожалуйста, проверьте сейчас   -  person Ruchira    schedule 16.02.2021
comment
@MarkMooibroek, пожалуйста, проверьте сейчас   -  person Ruchira    schedule 16.02.2021


Ответы (1)


Следующие ошибки:

К члену экземпляра setState нельзя получить доступ в инициализаторе. Попробуйте заменить ссылку на член экземпляра другим выражением dart (implicit_this_reference_in_initializer)

А также эта ошибка: - К члену экземпляра numDropdownVal нельзя получить доступ в инициализаторе. Попробуйте заменить ссылку на член экземпляра другим выражением dart (implicit_this_reference_in_initializer)

произошло потому, что, как говорится в ошибке, вы пытаетесь получить доступ к члену экземпляра (который еще не создан) при инициализации переменной.

Следующий код неверен:

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int _selectedIndex = 0;
  String numDropdownVal = 'One';

  static List<Widget>  _widgetOptions = <Widget>[
    Container(
      child: DropdownButton<String>(
        isExpanded: true,
        value: numDropdownVal, // You can't access the 'numDropdownVal' variable yet
                               // because it's not yet instantiated.

    ...
  ];

  ...
}

Чтобы исправить это, вы либо измените переменную как неявный получатель :

List<Widget> get _widgetOptions => <Widget>[...];

или измените его как метод, возвращающий список widget:

List<Widget> _widgetOptions () {
  return <Widget>[...];
}
person ישו אוהב אותך    schedule 16.02.2021
comment
Извините, я не показал полный код. Теперь я обновил вопрос полным кодом. Не могли бы вы проверить это еще раз. Эта строка находится ниже _widgetOptions.elementAt (_selectedIndex) - person Ruchira; 16.02.2021
comment
Вы не можете использовать elementAt метод, потому что _widgetOptions - это не список, а метод. Для этого вы можете использовать неявный геттер: List<Widget> get _widgetOptions => <Widget>[...]; - person ישו אוהב אותך; 16.02.2021
comment
У меня это сработало. - person Ruchira; 18.02.2021