Как использовать TabController

Я только что научился трепетать, я был сбит с толку, как использовать TabController, я следил за тем, что было описано на официальном сайте, но появилась ошибка, и я не знаю, как ее исправить.

Я просто хочу изменить заголовок и начало на панели приложений при смене вкладок.

final List<ChangeTitleAndLeading> _data = [
  new ChangeTitleAndLeading(title: "Home", leading: Icon(Icons.home)),
  new ChangeTitleAndLeading(title: "Profile", leading: Icon(Icons.person)),
  new ChangeTitleAndLeading(title: "Friends", leading: Icon(Icons.people))
];

ChangeTitleAndLeading _handler;
TabController _controller;

@override
void initState() {
  super.initState();

  _checkEmailVerification();

  _controller = TabController(vsync: this, length: 3);
  _handler = _data[0];
  _controller.addListener(_handleSelected);
}

@override
void dispose() {
  _controller.dispose();
  super.dispose();
}

void _handleSelected() {
  setState(() {
    _handler = _data[_controller.index];
  });
}

return MaterialApp(
  theme: new ThemeData(
    primarySwatch: Colors.teal,
  ),
  home: new Scaffold(
    appBar: new AppBar(
      leading: Icon(Icons.home),
      title: new Text("Home"),
      bottom: new TabBar(
        controller: _controller,
        tabs: _tabs,
      ),
    ),

    body: TabBarView(
      controller: _controller,
      children: _pages,
    ),

    floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          print('Current Index: ${_handler.title}');
        }
    ),

class ChangeTitleAndLeading {
  final String title;
  final Widget leading;

  ChangeTitleAndLeading({
    @required this.title,
    @required this.leading
  }) :
    assert(title != null),
    assert(leading != null);
}

Журнал ошибок:

Журнал ошибок: I / flutter (19638): нет TabController для TabBarView. I / flutter (19638): при создании TabBarView вы должны либо предоставить явный TabController, используя свойство «controller» I / flutter (19638):, либо вы должны убедиться, что есть DefaultTabController над TabBarView. I / flutter (19638): В этом случае не было ни явного контроллера, ни контроллера по умолчанию. ═════════════════════════════════════════════════ ═════════════════════════════════════════════════

I / flutter (19638): возникло другое исключение: нет TabController для TabBar.

И когда я меняю это: leading: Icon(Icons.home), на leading: _handler.leading,, а это: title: new Text("Home"), на title: new Text(_handler.title), всегда возвращает ошибку _handler.leading или _handler.title было нулевым

Изображение


person anangfaturrohman    schedule 27.03.2019    source источник
comment
лучше добавить свой код в текстовом формате   -  person Mazin Ibrahim    schedule 27.03.2019
comment
Ладно добавлю   -  person anangfaturrohman    schedule 27.03.2019
comment
сделано, пожалуйста, помогите   -  person anangfaturrohman    schedule 27.03.2019


Ответы (1)


Проблема в том, что вам не хватает tabbarcontroller.

Ваш код должен быть:

return MaterialApp(
  theme: new ThemeData(
    primarySwatch: Colors.teal,
  ),
  home: DefaultTabController(
    length: 3,
    child: new Scaffold(
      appBar: new AppBar(
        leading: Icon(Icons.home),
        title: new Text("Home"),
        bottom: new TabBar(
          controller: _controller,
          tabs: _tabs,
        ),
      ),
      body: TabBarView(
        controller: _controller,
        children: _pages,
      )...
person DevTard    schedule 27.03.2019
comment
Спасибо, теперь the getter leading was called on null ошибка на панели приложений leading: _handler.leading все еще не исправлена - person anangfaturrohman; 27.03.2019
comment
Вы пробовали инициализировать переменные? Сборка вызывается перед initstate - person DevTard; 27.03.2019
comment
Ок, я попробую, спасибо за помощь - person anangfaturrohman; 27.03.2019