Flutter - Как правильно удалить вкладку в TabBarView - PullRequest
0 голосов
/ 15 ноября 2018

Я использую TabBarView, чтобы создать похожее на браузер приложение с несколькими вкладками с динамическим созданием вкладок. Я следил за этим ответом . Однако я сталкиваюсь с довольно странной проблемой при попытке удалить вкладку. Поскольку я новичок, я не уверен, что поступил неправильно или это ошибка Flutter.

Обзор этой проблемы: если в TabBarView остались две вкладки, и вы удалили вторую вкладку во время просмотра , TabBarView выдает исключение, жалуясь, что не может выполнять анимацию прокрутки, когда номер элемента <2. Однако это исключение продолжает появляться <strong>, даже если я заранее переключил вкладку в функции. И с этого момента это исключение нарушает управление вкладками.

Я был бы очень признателен, если бы кто-нибудь показал мне правильный способ реализации системы динамических вкладок.

Демонстрационный код выглядит следующим образом. Код завершен и готов к запуску. Создайте несколько вкладок, затем удалите их от начала до конца . Исключение произойдет, когда вы удалите вторую последнюю вкладку. После этого система вкладок будет вести себя как беспорядок.

import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
  @override MyAppState createState() => MyAppState();
}
class MyAppState extends State<MyApp> with TickerProviderStateMixin {
  List<Tab> tabs = [];TabController tabController;var count = 1;
  void newTab() {
    setState(() {
      tabs.add(Tab(text: '$count',));count++;
      tabController = TabController(length: tabs.length, vsync: this);
    });
  }
  void closeCurrentTab() {
    setState(() {
      //  A bunch of if-statement..........
      //  Even if you switch the tab before deletion, the error still occur.
      //tabController.animateTo(tabController.index-1);
      tabs.removeAt(tabController.index);
      tabController = TabController(length: tabs.length, vsync: this);
    });
  }
  @override void initState() {
    super.initState();
    tabs.add(Tab(text: '0',));
    tabController = TabController(length: tabs.length, vsync: this);
  }
  @override void dispose() {
    tabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          actions: <Widget>[
            IconButton(icon: Icon(Icons.add), onPressed: newTab),
            IconButton(icon: Icon(Icons.close), onPressed: closeCurrentTab,)
          ],
          bottom: TabBar(controller: tabController, tabs: tabs.map((tab) => tab).toList()),// A trick to trigger TabBar rebuild.
        ),
        body: TabBarView(controller: tabController, children: tabs.map((tab) => Text(tab.text)).toList()),
      ),
    );
  }
}

Мне кажется, что анимация прокрутки после удаления выполняется независимо от TabController.animateTo ().

1 Ответ

0 голосов
/ 19 ноября 2018

Ну, это оказывается ошибка виджета флаттера. Не следует выдавать это исключение при удалении вкладок.

Как сообщается в этом выпуске Github . Это должно быть исправлено когда-нибудь в будущем.

Прямо сейчас я использую PageView в качестве альтернативы. PageView работает просто отлично.

...