flutter - 如何根据按下的按钮呈现不同的小部件
问题描述
我创建了一个可水平滚动的项目列表,并且我试图根据按下的按钮呈现不同的小部件。小部件在不同且独立的文件中创建。我需要实现的是根据按下的按钮导入它们的小部件。例如,当在列表中按下“DropDown”的按钮时,会呈现“DropDown”的小部件。画面如下:
这是按钮列表的代码以及我应该在哪里导入小部件:
class CategoryListState extends State<CategoryList> {
int selectedIndex = 0;
List categories = ['Checkboxes', 'DropDown', 'SwipeCards', 'SwipeCards', 'SwipeCards', 'SwipeCards',];
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.symmetric(vertical: 20.0/2),
height: 30.0,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: categories.length,
itemBuilder: (context, index) => GestureDetector(
onTap: () {
setState(() {
selectedIndex = index;
});
},
child: Container (
alignment: Alignment.center,
margin: EdgeInsets.only(
left: 20.0,
right: index == categories.length -1 ? 20.0 : 0,
),
padding: EdgeInsets.symmetric(horizontal: 20.0),
decoration: BoxDecoration(
color: index == selectedIndex
? Colors.white.withOpacity(0.4)
: Colors.transparent,
borderRadius: BorderRadius.circular(6),
),
child: Text(
categories[index].toString(),
style: TextStyle(color: Colors.white),
),
),
),
),
);
}
}
解决方案
您可以创建在不同文件中创建的小部件列表,并将其作为子项提供,您需要根据按下的按钮更改内容。
你可以这样做:
class CategoryListState extends State<CategoryList> {
int selectedIndex = 0;
List categories = ['Checkboxes', 'DropDown', 'SwipeCards', 'SwipeCards', 'SwipeCards', 'SwipeCards',];
//Your list of widgets that you import, note: keep the order same as categories
List<Widget> category_widgets = [checkboxes_widget, dropDown_widget, swipeCards_widget, swipeCards_widget, swipeCards_widget, swipeCards_widget,];
@override
Widget build(BuildContext context) {
return Column(
children: <Wdiget>[
Container(
margin: EdgeInsets.symmetric(vertical: 20.0/2),
height: 30.0,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: categories.length,
itemBuilder: (context, index) => GestureDetector(
onTap: () {
setState(() {
selectedIndex = index;
});
},
child: Container (
alignment: Alignment.center,
margin: EdgeInsets.only(
left: 20.0,
right: index == categories.length -1 ? 20.0 : 0,
),
padding: EdgeInsets.symmetric(horizontal: 20.0),
decoration: BoxDecoration(
color: index == selectedIndex
? Colors.white.withOpacity(0.4)
: Colors.transparent,
borderRadius: BorderRadius.circular(6),
),
child: Text(
categories[index].toString(),
style: TextStyle(color: Colors.white),
),
),
),
),
),
//Here the widget will be loaded when the selected_index changes i.e when you press a button the widget below will also change accordingly
category_widgets[selected_index],
]
);
}
}
推荐阅读
- php - PHP中的所有声明是什么?
- sql - PostgreSQL 查询间隔数据
- java - 如何使用带有类继承的 Spring 依赖注入
- php - 在 Woocommerce 存档页面中显示变体的尺寸产品属性值
- unity3d - 为什么我在 Unity 的 apk 中缺少“META-INF”文件夹?
- php - FOSRestBundle 2.3 的配置文件?
- c# - 将子查询限制在第一行的 Lambda 语法是什么?
- angularjs - 如何处理angularJS ng-if中的异步变量?
- python-3.x - ValueError: Series 的真值不明确 - 检查 pandas 列中的值
- ethereum - 是否可以获得从另一个合同外部函数获取数据的外部函数的返回值?