如何在选项卡中重用listview?

如何在选项卡中重用listview?,listview,dart,flutter,tabs,Listview,Dart,Flutter,Tabs,我想在带有两个选项卡的平面布局中重用ListView。例如,我想用它来显示《旧约》和《新约》中的所有书籍,也就是说,使用相同的列表视图在不同的选项卡上显示这两个列表。我如何做到这一点? 下面是到目前为止我已经想到的代码。我正在考虑使用tab控制器访问当前列表的索引,并使用它显示正确的列表。然而,我无法做到这一点,我似乎无法想出这样做的逻辑。多谢各位 import 'package:flutter/material.dart'; import 'package:navigation_drawer/

我想在带有两个选项卡的平面布局中重用ListView。例如,我想用它来显示《旧约》和《新约》中的所有书籍,也就是说,使用相同的列表视图在不同的选项卡上显示这两个列表。我如何做到这一点? 下面是到目前为止我已经想到的代码。我正在考虑使用tab控制器访问当前列表的索引,并使用它显示正确的列表。然而,我无法做到这一点,我似乎无法想出这样做的逻辑。多谢各位

import 'package:flutter/material.dart';
import 'package:navigation_drawer/tabs/old_testament.dart';
import 'package:navigation_drawer/tabs/new_testament.dart';
import 'package:navigation_drawer/model/book.dart';

void main() {
  runApp(new MaterialApp(
    title: "Testament",
    home: new HomeTab(),
  ));
}

class HomeTab extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new TabState();
}

// SingleTickerProviderStateMixin is used for animation
class TabState extends State<HomeTab> with SingleTickerProviderStateMixin {
  // Create a tab controller
  TabController controller;

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

    // Initialize the Tab Controller
    controller = new TabController(length: 2, vsync: this);
  }

  @override
  void dispose() {
    // Dispose of the Tab Controller
    controller.dispose();
    super.dispose();
  }

  TabBar getTabBar() {
    return new TabBar(
      tabs: <Tab>[
        new Tab(
          // set icon to the tab
          icon: new Icon(Icons.brightness_2),
          text: "Old Testament",
        ),
        new Tab(
          icon: new Icon(Icons.brightness_6),
          text: "New Testament",
        ),
      ],
      // setup the controller
      controller: controller,
    );
  }

  TabBarView getTabBarView(var tabs) {
    return new TabBarView(
      // Add tabs as widgets
      children: tabs,
      // set the controller
      controller: controller,
    );
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      // Appbar
      appBar: new AppBar(
        centerTitle: true,
        // Title
        title: new Text("Testament"),
        // Set the background color of the App Bar
        backgroundColor: Colors.blue,
        // Set the bottom property of the Appbar to include a Tab Bar
        bottom: getTabBar()
      ),
      // Set the TabBar view as the body of the Scaffold
      body: getTabBarView(<Widget>[new OldTestament(), new NewTestament()])
    );
  }    
}

class ListTab extends StatefulWidget {
  ListTab({Key key}) : super(key: key);

  @override
  State<StatefulWidget> createState() => ListTabState();
}

class ListTabState extends State<ListTab> {
  List books;

  @override
  void initState() {
    books = getOldTestamentBooks(); 
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    // create a list tile for books
    ListTile makeListTile(Book book) => ListTile(
      contentPadding:
      EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
      leading: Container(
        padding: EdgeInsets.only(right: 12.0),
        decoration: new BoxDecoration(
          border: new Border(
            right: new BorderSide(
              width: 1.0,
              color: Colors.blue
            )
          )
        ),
        child: Icon(
          Icons.book,
          color: Colors.grey
        ),
      ),
      title: Text(
        book.title,
        style: TextStyle(
          color: Colors.black,
          fontWeight: FontWeight.bold
        ),
      ),

      subtitle: Row(
        children: <Widget>[
          Expanded(
            flex: 4,
            child: Padding(
              padding: EdgeInsets.only(left: 10.0),
              child: Text(
                  book.testament,
                  style: TextStyle(color: Colors.black)
              )
            ),
          )
        ],
      ),
      trailing: Icon(
          Icons.keyboard_arrow_right,
          color: Colors.black,
          size: 30.0
      ),
      onTap: () {},
    );

    // create a card view for the list tile
    Card makeCard(Book book) => Card(
      elevation: 8.0,
      margin: new EdgeInsets.symmetric(horizontal: 10.0, vertical: 6.0),
      child: Container(
        decoration: BoxDecoration(
          color: Colors.white,
          borderRadius: new BorderRadius.circular(5.0),
        ),
        child: makeListTile(book),
      ),
    );

    final makeBody = Container(
      child: ListView.builder(
        scrollDirection: Axis.vertical,
        shrinkWrap: true,
        itemCount: books.length,
        itemBuilder: (BuildContext context, int index) {
          return makeCard(books[index]);
        },
      ),
    );


    return Scaffold(
      backgroundColor: Colors.white,
      body: makeBody,
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“package:navigation_drawer/tabs/old_testant.dart”;
导入“package:navigation_drawer/tabs/new_testant.dart”;
导入“package:navigation_drawer/model/book.dart”;
void main(){
runApp(新材料)PP(
标题:“遗嘱”,
主页:新主页选项卡(),
));
}
类HomeTab扩展StatefulWidget{
@凌驾
State createState()=>new TabState();
}
//SingleTickerProviderStateMixin用于动画
类TabState使用SingleTickerProviderStateMixin扩展状态{
//创建选项卡控制器
tab控制器;
@凌驾
void initState(){
super.initState();
//初始化选项卡控制器
控制器=新的TabController(长度:2,vsync:this);
}
@凌驾
无效处置(){
//处理选项卡控制器
controller.dispose();
super.dispose();
}
TabBar gettabar(){
返回新选项卡栏(
选项卡:[
新标签(
//将图标设置为选项卡
图标:新图标(图标亮度2),
正文:“旧约”,
),
新标签(
图标:新图标(图标亮度_6),
正文:“新约”,
),
],
//设置控制器
控制器:控制器,
);
}
TabBarView getTabBarView(变量选项卡){
返回新选项卡视图(
//将选项卡添加为小部件
子项:选项卡,
//设置控制器
控制器:控制器,
);
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
//Appbar
appBar:新的appBar(
标题:对,
//头衔
标题:新文本(“遗嘱”),
//设置应用程序栏的背景色
背景颜色:Colors.blue,
//将Appbar的底部属性设置为包含选项卡栏
底部:gettabar()
),
//将选项卡栏视图设置为脚手架主体
正文:gettabarview([新约(),新约()
);
}    
}
类ListTab扩展StatefulWidget{
ListTab({Key}):超级(Key:Key);
@凌驾
State createState()=>ListTabState();
}
类ListTabState扩展了状态{
列出书籍;
@凌驾
void initState(){
books=getoldTestmentBooks();
super.initState();
}
@凌驾
小部件构建(构建上下文){
//为书籍创建列表平铺
ListTile makeListTile(书本)=>ListTile(
内容填充:
边缘组。对称(水平:20.0,垂直:10.0),
领先:集装箱(
填充:仅限边缘设置(右侧:12.0),
装饰:新盒子装饰(
边界:新边界(
右:新边界(
宽度:1.0,
颜色:颜色。蓝色
)
)
),
子:图标(
Icons.book,
颜色:颜色。灰色
),
),
标题:正文(
书名,
样式:TextStyle(
颜色:颜色,黑色,
fontWeight:fontWeight.bold
),
),
字幕:世界其他地区(
儿童:[
扩大(
弹性:4,
孩子:填充(
填充:仅限边缘设置(左:10.0),
子:文本(
书,遗嘱,
样式:TextStyle(颜色:Colors.black)
)
),
)
],
),
尾随:图标(
图标。键盘\箭头\右侧,
颜色:颜色,黑色,
尺寸:30.0
),
onTap:(){},
);
//为列表磁贴创建卡片视图
卡片制作卡片(书本)=>卡片(
标高:8.0,
边距:新边集。对称(水平:10.0,垂直:6.0),
子:容器(
装饰:盒子装饰(
颜色:颜色,白色,
边界半径:新边界半径。圆形(5.0),
),
孩子:makeListTile(书),
),
);
最终生成体=容器(
子项:ListView.builder(
滚动方向:轴垂直,
收缩膜:对,
itemCount:books.length,
itemBuilder:(构建上下文,int索引){
归还卡片(书籍[索引]);
},
),
);
返回脚手架(
背景颜色:Colors.white,
body:makeBody,
);
}
}

如果我理解正确,您希望重用相同的列表视图来显示书籍列表(旧约在一个选项卡中,新约在另一个选项卡中)。 我建议您创建一个只包含Listview.builder和ListTile模型的小部件,它将书籍列表作为构造函数的参数

将ListView小部件与ListTab分离后,新的小部件类将如下所示:

导入“包装:颤振/材料.省道”;
导入“package:navigation_drawer/model/book.dart”;
类BookList扩展了无状态小部件{
列出你的书;
书单(本书);
@凌驾
小部件构建(构建上下文){
返回容器(
子项:ListView.builder(
滚动方向:轴垂直,
收缩膜:对,
itemCount:_books.length,
itemBuilder:(构建上下文,int索引){
回程卡(
标高:8.0,
边距:新边集。对称(水平:10.0,垂直:6.0),
子:容器(
装饰:盒子装饰(
颜色:颜色,白色,
边界半径