Tabs 我可以将TabBar和TabBarView用作页面内小部件吗?

Tabs 我可以将TabBar和TabBarView用作页面内小部件吗?,tabs,flutter,Tabs,Flutter,在探索颤振框架的过程中,我遇到了一个问题,我不知道如何解决。作为其他小部件的子部件,我可以与结合使用吗?证明它是有效的。这是相关的代码片段: new Container( decoration: new BoxDecoration(color: Theme.of(context).primaryColor), child: new TabBar( controller: _controller, tabs: [ new Tab( icon: c

在探索颤振框架的过程中,我遇到了一个问题,我不知道如何解决。作为其他小部件的子部件,我可以与结合使用吗?

证明它是有效的。这是相关的代码片段:

new Container(
  decoration: new BoxDecoration(color: Theme.of(context).primaryColor),
  child: new TabBar(
    controller: _controller,
    tabs: [
      new Tab(
        icon: const Icon(Icons.home),
        text: 'Address',
      ),
      new Tab(
        icon: const Icon(Icons.my_location),
        text: 'Location',
      ),
    ],
  ),
),
new Container(
  height: 80.0,
  child: new TabBarView(
    controller: _controller,
    children: <Widget>[
      new Card(
        child: new ListTile(
          leading: const Icon(Icons.home),
          title: new TextField(
            decoration: const InputDecoration(hintText: 'Search for address...'),
          ),
        ),
      ),
      new Card(
        child: new ListTile(
          leading: const Icon(Icons.location_on),
          title: new Text('Latitude: 48.09342\nLongitude: 11.23403'),
          trailing: new IconButton(icon: const Icon(Icons.my_location), onPressed: () {}),
        ),
      ),
    ],
  ),
),
新容器(
装饰:新盒子装饰(颜色:主题。背景。原色),
孩子:新的TabBar(
控制器:_控制器,
选项卡:[
新标签(
图标:常量图标(Icons.home),
文本:“地址”,
),
新标签(
图标:常量图标(图标。我的位置),
文本:“位置”,
),
],
),
),
新容器(
身高:80.0,
子项:新选项卡视图(
控制器:_控制器,
儿童:[
新卡(
孩子:新的ListTile(
前导:常量图标(Icons.home),
标题:新文本字段(
装饰:常量输入装饰(hintText:“搜索地址…”),
),
),
),
新卡(
孩子:新的ListTile(
前导:常量图标(图标位置打开),
标题:新文本(“纬度:48.09342\n纬度:11.23403”),
尾随:新图标按钮(图标:const图标(Icons.my_位置),onPressed:(){}),
),
),
],
),
),
这是一个有效的例子:

导入“包装:颤振/材料.省道”;
void main(){
runApp(新的MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“颤振演示”,
主页:新建MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState使用SingleTickerProviderStateMixin扩展状态{
TabController\u控制器;
@凌驾
void initState(){
super.initState();
_控制器=新的TabController(长度:2,vsync:this);
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(“TestProject”),
),
正文:新列表视图(
儿童:[
新卡(
孩子:新的ListTile(
标题:常量文本(“某些信息”),
),
),
新容器(
装饰:新盒子装饰(颜色:主题。背景。原色),
孩子:新的TabBar(
控制器:_控制器,
选项卡:[
新标签(
图标:常量图标(Icons.home),
文本:“地址”,
),
新标签(
图标:常量图标(图标。我的位置),
文本:“位置”,
),
],
),
),
新容器(
身高:80.0,
子项:新选项卡视图(
控制器:_控制器,
儿童:[
新卡(
孩子:新的ListTile(
前导:常量图标(Icons.home),
标题:新文本字段(
装饰:常量输入装饰(hintText:“搜索地址…”),
),
),
),
新卡(
孩子:新的ListTile(
前导:常量图标(图标位置打开),
标题:新文本(“纬度:48.09342\n纬度:11.23403”),
尾随:新图标按钮(图标:const图标(Icons.my_位置),onPressed:(){}),
),
),
],
),
),
新卡(
孩子:新的ListTile(
标题:const Text(“更多信息”),
),
),
新升起的按钮(
颜色:主题。背景。原色,
按下:(){},
子:常量文本(
“搜索POI”,
样式:const TextStyle(颜色:Colors.white),
),
),
],
),
);
}
}

如果在
选项卡视图
中具有可变高度,则可以使用
展开的

body:
    ...
    new Expanded(
        child: new TabBarView(
          controller: _controller,
          children: <Widget>[
            new Card(
              child: new ListTile(
                leading: const Icon(Icons.home),
                title: new TextField(
                  decoration: const InputDecoration(hintText: 'Search for address...'),
                ),
              ),
            ),//Card
            .... 
            ....
          ],//Widget
        ),//TabBarView
      ),//Expanded
正文:
...
新扩展(
子项:新选项卡视图(
控制器:_控制器,
儿童:[
新卡(
孩子:新的ListTile(
前导:常量图标(Icons.home),
标题:新文本字段(
装饰:常量输入装饰(hintText:“搜索地址…”),
),
),
),//卡片
.... 
....
],//小部件
),//选项卡视图
),//扩展

在屏幕上特定位置的选项卡栏。具有滚动选项卡的选项卡栏

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TabsPage(),
    );
  }
}

class TabModel {
  final String title;
  final Widget child;

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

class TabsPage extends StatefulWidget {
  @override
  _TabsPageState createState() => _TabsPageState();
}

class _TabsPageState extends State<TabsPage> {
  final List<TabModel> _tabs = <TabModel>[
    TabModel(title: 'Название', child: Text('Название')),
    TabModel(title: 'Описание', child: Text('Описание')),
    TabModel(title: 'Видео', child: Text('Видео')),
    TabModel(title: 'Название', child: Text('Название')),
    TabModel(title: 'Описание', child: Text('Описание')),
    TabModel(title: 'Видео', child: Text('Видео')),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Container(
            height: 300,
          ),
          Expanded(
            child: DefaultTabController(
              length: _tabs.length,
              child: Scaffold(
                appBar: AppBar(
                  toolbarHeight: 28,
                  backgroundColor: Colors.amber,
                  flexibleSpace: Column(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      TabBar(
                        isScrollable: true,
                        tabs: [
                          ..._tabs.map(
                            (tab) {
                              return Tab(
                                text: tab.title,
                              );
                            },
                          ).toList()
                        ],
                      ),
                    ],
                  ),
                ),
                body: TabBarView(
                  children: <Widget>[
                    ..._tabs.map(
                      (tab) {
                        return tab.child;
                      },
                    )
                  ],
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:TabsPage(),
);
}
}
类TabModel{
最后的字符串标题;
最后一个孩子;
TabModel({
@需要这个标题,
@需要这个孩子,
}):assert(title!=null),
断言(child!=null);
}
类TabsPage扩展StatefulWidget{
@凌驾
_tabspagentate createState()=>tabspagentate();
}
类_tabspagentate扩展状态{
最终列表_选项卡=[
TabModel(标题:“азаааааа”,子项:文本(“азааааа,
TabModel(标题:“CharStyleПаааааа”,子项:文本(“CharStyleПаааааа”),
TabModel(标题:'b砦砦砦砦砦',子项:文本('b砦砦砦砦'),
TabModel(标题:“азаааааа”,子项:文本(“азааааа,
TabModel(标题:“CharStyleПаааааа”,子项:文本(“CharStyleПаааааа”),
TabModel(标题:'b砦砦砦砦砦',子项:文本('b砦砦砦砦'),
];
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
儿童:[
容器(
身高:300,
),
扩大(
子级:DefaultTabController(
长度:_.length,
孩子:脚手架
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TabsPage(),
    );
  }
}

class TabModel {
  final String title;
  final Widget child;

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

class TabsPage extends StatefulWidget {
  @override
  _TabsPageState createState() => _TabsPageState();
}

class _TabsPageState extends State<TabsPage> {
  final List<TabModel> _tabs = <TabModel>[
    TabModel(title: 'Название', child: Text('Название')),
    TabModel(title: 'Описание', child: Text('Описание')),
    TabModel(title: 'Видео', child: Text('Видео')),
    TabModel(title: 'Название', child: Text('Название')),
    TabModel(title: 'Описание', child: Text('Описание')),
    TabModel(title: 'Видео', child: Text('Видео')),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Container(
            height: 300,
          ),
          Expanded(
            child: DefaultTabController(
              length: _tabs.length,
              child: Scaffold(
                appBar: AppBar(
                  toolbarHeight: 28,
                  backgroundColor: Colors.amber,
                  flexibleSpace: Column(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      TabBar(
                        isScrollable: true,
                        tabs: [
                          ..._tabs.map(
                            (tab) {
                              return Tab(
                                text: tab.title,
                              );
                            },
                          ).toList()
                        ],
                      ),
                    ],
                  ),
                ),
                body: TabBarView(
                  children: <Widget>[
                    ..._tabs.map(
                      (tab) {
                        return tab.child;
                      },
                    )
                  ],
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}