首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flutter: TabBar没有TabController

Flutter: TabBar没有TabController
EN

Stack Overflow用户
提问于 2021-05-16 20:39:29
回答 1查看 122关注 0票数 0

我正在写我的手机页面。为此,我向一个名为"FeatureBar“的类传递了一个TabBar。在此功能栏(位于移动页面顶部)内,当页面位于移动页面下方时,应显示选项卡面板。

admin_view_mobile.dart:

代码语言:javascript
运行
复制
import 'package:myPckg/generated/i18n.dart';
import 'package:myPckg/widgets/feature_bar/feature_bar.dart';
import 'package:myPckg/widgets/user_list/user_list.dart';
import 'package:myPckg/models/user.dart';
import 'package:myPckg/widgets/app_bar/app_bar.dart';
import 'package:myPckg/widgets/app_drawer/app_drawer.dart';

/// Contains the widgets that will be used for mobile layout of home,
/// portrait and landscape

import 'package:flutter/material.dart';

class AdminMobilePortrait extends StatefulWidget {
  final String title;
  final User appUser;
  final List<Widget> pages;

  AdminMobilePortrait(
      {Key? key,
      required this.title,
      required this.appUser,
      required this.pages})
      : super(key: key);

  @override
  _AdminMobilePortraitState createState() => _AdminMobilePortraitState();
}

class _AdminMobilePortraitState extends State<AdminMobilePortrait>
    with SingleTickerProviderStateMixin {
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
  late TabController tabController;
  late TabBar tabBar;
  late FeatureBar _featureBar;
  late TextEditingController editorEmailController;

  @override
  void initState() {
    print("uid: " + this.widget.appUser.id);
    tabController = TabController(
        length: this.widget.pages.length, vsync: this, initialIndex: 0);
    print("_tabController set up!!");
    print("_tabController.length: " + tabController.length.toString());
    editorEmailController = TextEditingController();
    super.initState();
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    tabBar = TabBar(
      automaticIndicatorColorAdjustment: true,
      controller: tabController,
      tabs: <Widget>[
        Tab(
            text: I18n.of(context)!.admin_section_users_label,
            icon: Icon(Icons.supervised_user_circle)),
        Tab(
          text: I18n.of(context)!.admin_section_organizations_label,
          icon: Icon(Icons.business),
        ),
      ],
    );
    _featureBar = new FeatureBar(
      title: this.widget.title,
      tabBar: tabBar,
    );
    print("_tabBar and _featureBar set up!!");
  }

  @override
  void dispose() {
    print("dispose() of admin_view_mobile called!!!!");
    tabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    print("Title in mobile-admin: " + this.widget.title);
    return Scaffold(
      key: _scaffoldKey,
      appBar: PreferredSize(
          preferredSize: const Size.fromHeight(50),
          child: CustomAppBar(
            title: this.widget.title,
          )),
      drawer: AppDrawer(),
      body: Column(
        children: [
          _featureBar,
          TabBarView(
            controller: tabController,
            children: <Widget>[
              Center(child: Text("TabPage 1")),
              Center(child: Text("TabPage 2"))
              //this.widget.pages[0],
              //this.widget.pages[1],
            ],
          ),
        ],
      ),
    );
  }
}

feature_bar.dart:

代码语言:javascript
运行
复制
import 'package:flutter/material.dart';
import 'package:responsive_builder/responsive_builder.dart';

import 'feature_bar_mobile.dart';
import 'feature_bar_tablet.dart';

class FeatureBar extends StatelessWidget {
  final String title;
  final TabBar tabBar = const TabBar(
    tabs: <Widget>[],
  );

  const FeatureBar({Key? key, required this.title, TabBar? tabBar})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ScreenTypeLayout(
      mobile: FeatureBarMobile(title: this.title, tabBar: this.tabBar),
      tablet: OrientationLayoutBuilder(
        portrait: (context) => FeatureBarTabletPortrait(title: this.title),
        landscape: (context) => AppBarTabletLandscape(title: this.title),
      ),
    );
  }
}

feature_bar_mobile.dart:

代码语言:javascript
运行
复制
import 'package:flutter/material.dart';

class FeatureBarMobile extends StatelessWidget {
  final String title;
  final TabBar tabBar;
  const FeatureBarMobile({Key? key, required this.title, required this.tabBar})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    try {
      print("tabBar.tabs length in " +
          this.title +
          ": " +
          this.tabBar.controller!.length.toString());
    } catch (e) {
      print(e);
    }
    return Column(
      mainAxisAlignment: MainAxisAlignment.end,
      children: [Text(this.title), this.tabBar],
    );
  }
}

但它仍然说TabBar的TabController丢失了:(

代码语言:javascript
运行
复制
_tabController set up!!
_tabController.length: 2
_tabBar and _featureBar set up!!
Title in mobile-admin: Admin
UserLogin in login-widget: true
Appbar title: Admin
Unexpected null value.
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building FeatureBarMobile:
No TabController for TabBar.
When creating a TabBar, you must either provide an explicit TabController using the "controller"
property, or you must ensure that there is a DefaultTabController above the TabBar.
In this case, there was neither an explicit controller nor a default controller.

The relevant error-causing widget was:
  FeatureBarMobile
  file:///C:/projects/vs%20code/myPckg/lib/widgets/feature_bar/feature_bar.dart:19:15

当我把所有东西都放在admin_view_mobile中时,它可以工作,但我想把TabHeaders放在FeatureBar中。这是错误的方法,还是我只是错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-05-16 23:07:35

您通过构造函数将tabBar传递给FeatureBar小部件,但没有使用它。相反,您将创建一个新的TabBar实例:

代码语言:javascript
运行
复制
final TabBar tabBar = const TabBar(
  tabs: <Widget>[],
);

如下所示调整feature_bar.dart中的代码:

代码语言:javascript
运行
复制
class FeatureBar extends StatelessWidget {
  final String title;
  final TabBar tabBar;

  const FeatureBar({Key? key, required this.title, required this.tabBar})
      : super(key: key);
  ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67556784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档