Переключение с tab1 на tab3 в flutter дает ошибку-минимальное приложение flutter

В настоящее время у меня есть TabBarView.TabBarView имеет 3 вкладки. На второй вкладке есть страница, на которой также есть две вкладки. Теперь проблема в том, что я переключаюсь непосредственно с tab0 на tab2. Я получаю следующую ошибку:

flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
flutter: The following assertion was thrown while finalizing the widget tree:
flutter: 'package:flutter/src/widgets/scroll_position.dart': Failed assertion: line 627 pos 12: 'pixels !=
flutter: null': is not true.
flutter:
flutter: Either the assertion indicates an error in the framework itself, or we should provide substantially
flutter: more information in this error message to help you determine and fix the underlying cause.
flutter: In either case, please report this assertion by filing a bug on GitHub:
flutter:   https://github.com/flutter/flutter/issues/new
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #2      ScrollPosition.dispose (package:flutter/src/widgets/scroll_position.dart)
flutter: #3      ScrollPositionWithSingleContext.dispose (package:flutter/src/widgets/scroll_position_with_single_context.dart:260:11)
flutter: #4      ScrollableState.dispose (package:flutter/src/widgets/scrollable.dart:324:14)
flutter: #5      StatefulElement.unmount (package:flutter/src/widgets/framework.dart:3821:12)
flutter: #6      _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1697:13)
flutter: #7      _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1695:7)
flutter: #8      ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3676:14)
flutter: #9      _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1693:13)

Это само приложение

Page : main.dart
import 'package:flutter/material.dart';
import "TabsPage.dart";

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {

  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>  with SingleTickerProviderStateMixin {

  TabController _tabController;
  var tabBarView;
  var bottomNavigationBar;

  void initializeTabs()
  {
    _tabController = new TabController(vsync: this, length: 3);
  }

  Widget getBottomNavigationBar() {
    bottomNavigationBar = new Material(
            child: new TabBar(controller: _tabController, tabs: <Tab>[
              new Tab(text: "PageA" ),
              new Tab(text: "PageB"),
              new Tab(text: "PageC"),
            ]));
    return bottomNavigationBar;
  }

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

  @override
  Widget build(BuildContext context) {


    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Tabs demo"),
        automaticallyImplyLeading: false,
        ),
      bottomNavigationBar: getBottomNavigationBar(), //Add the bottom Navigation Bar
      body:  new TabBarView(controller: _tabController, children: <Widget>[
        new Text("PageA"),
        new MyTest(),
        new Text("PageC"),
      ]), //The container that will display the pages
      );
  }
}

и это вторая страница

import 'package:flutter/material.dart';

class MyTest extends StatefulWidget {
    MyTest();

    @override
    MyTestState createState() => new MyTestState();
}

    class MyTestState extends State<MyTest> with SingleTickerProviderStateMixin ,RouteAware {
        bool isAlive;
        TabController _tabController;
        var tabBarView;

        MyTestState();

        @override
        void initState() {
            super.initState();
            _tabController = new TabController(vsync: this, length: 2,initialIndex: 1);

        }

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

        @override
        Widget build(BuildContext context) {
            var scaffold = Scaffold(
                appBar: new AppBar(
                    automaticallyImplyLeading: false,
                    bottom: new PreferredSize(
                        preferredSize: new Size(200.0, 15.0),
                        child: new Container(
                            width: 200.0,
                            child: new TabBar(
                                controller: _tabController,
                                tabs: [
                                    new Container(
                                        child: new Tab(text: 'TabA'),
                                        ),
                                    new Container(
                                        child: new Tab(text: 'TabB'),
                                        ),
                                ],
                                ),
                            ),
                        ),

                    ),
                body: new TabBarView(controller: _tabController, children: <Widget>[

                    new Text("Hello World in TabA"),
                    new Text("Hello World in TabB"),
                ]), //The container that will display the pages
                );

            return scaffold;
        }
}

эта проблема не возникает, если я заменяю TabBarView из тела второй страницы

3 ответов


Я сообщил об этой ошибке очень давно

https://github.com/flutter/flutter/issues/11267

https://github.com/flutter/flutter/issues/11350

Я понимаю, что у вас не может быть вложенных лесов. Если вложить леса, поведение становится неопределенным и не поддерживается командой flutter.

рефакторинг вашего приложения, чтобы леса больше не гнездились


вы используете те же TabController для наружной и внутренней TabBarViews?

Если да, пожалуйста, используйте другой TabController для каждого TabBarView. Должны быть какие-то конфликты с позиционированием страницы.


это происходит потому, что пользовательский интерфейс не завершает рендеринг до перехода на новую вкладку.Встраивание вкладок в вкладки-плохая идея дизайна