Индекс TabBar изменяется, когда он прячется - PullRequest
0 голосов
/ 23 октября 2019

Я строю каркас с TabBar в качестве BottomNavigationBar и TabView в качестве тела. Проблема в том, что когда я открываю клавиатуру для ввода данных в форму, по какой-то причине TabBar меняет индекс (даже если внутри TabView нет). Почему это происходит? Как я могу это проверить?

    class _SignState extends State<Sign> with TickerProviderStateMixin {
  static Container navBar;
  static TabBarView pages;

  @override
  Widget build(BuildContext context) {
    final tabController = TabController(length: 2, vsync: this);

    print(tabController.index);
    void _goLogin() {
      //  tabController.animateTo(tabController.previousIndex);
    }

    pages = TabBarView(controller: tabController, children: [
      LoginPage(
        keyRoot: widget.keyRoot,
      ),
      RegisterPage(
        onRegistered: _goLogin,
      ),
    ]);

    navBar = Container(
      height: 50,
      alignment: Alignment.center,
      padding: EdgeInsets.only(left: 50, right: 50),
      child: Stack(
        alignment: Alignment.center,
        children: <Widget>[
          Padding(
            padding: const EdgeInsets.all(10.0),
            child: Container(
                decoration: BoxDecoration(
                    color: Colors.transparent,
                    borderRadius: BorderRadius.circular(30),
                    border: Border.all(
                        width: 0.3,
                        color: Colors.black.withOpacity(0.5),
                        style: BorderStyle.solid))),
          ),
          TabBar(
              controller: tabController,
              labelPadding: EdgeInsets.all(10),
              labelColor: Colors.white,
              unselectedLabelColor: Theme.of(context).primaryColor,
              indicator: BoxDecoration(
                boxShadow: [
                  BoxShadow(
                    color: Colors.black,
                    blurRadius: 1,
                  )
                ],
                borderRadius: BorderRadius.circular(30),
                color: Theme.of(context).primaryColor,
              ),
              tabs: [Text('Accedi'), Text('Registrati')]),
        ],
      ),
    );

    // Main page

    return Scaffold(
      body: Column(
        children: <Widget>[
          _returnTop(),
          Expanded(
            child: pages,
          ),
        ],
      ),
      persistentFooterButtons: _returnButtons(),
      bottomNavigationBar: Padding(
        padding: const EdgeInsets.only(bottom: 15),
        child: navBar,
      ),
    );
  }

      Widget _returnTop() {
        return Stack(children: <Widget>[
          Center(child: Image.asset('assets/logo_sign.png')),
          Positioned(
            bottom: 0,
            right: 20,
            child: InkWell(
              splashColor: Colors.transparent,
              child: Text('salta >'),
              onTap: () {
                Navigator.pushNamed(context, "/home", arguments: widget.keyRoot);
              },
            ),
          )
        ]);
      }

      List<Widget> _returnButtons() {
        return [
          Text('oppure con'),
          IconButton(
              //TODO: Aggiungere funzioni
              color: Theme.of(context).accentColor,
              icon: Icon(FontAwesomeIcons.googlePlusG),
              tooltip: 'Login con Google',
              onPressed: () {}),
          IconButton(
              //TODO: Aggiungere funzioni
              color: Theme.of(context).accentColor,
              icon: Icon(FontAwesomeIcons.facebook),
              tooltip: 'Login con Facebook',
              onPressed: () {}),
          IconButton(
              //TODO: Aggiungere funzioni
              color: Theme.of(context).accentColor,
              icon: Icon(FontAwesomeIcons.twitter),
              tooltip: 'Login con Twitter',
              onPressed: () {}),
        ];
      }
    }

Изменено: Это весь мой код:)

1 Ответ

0 голосов
/ 23 октября 2019

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

  @override
  void initState() {
    super.initState();
    _tabController = TabController(vsync: this, length: choices.length);
  }
...