Flutter Flatter bloc:轻触时更改每个项目的颜色
我尝试使用颤振阵型,因此我创建了以下阵型:Flutter Flatter bloc:轻触时更改每个项目的颜色,flutter,flutter-bloc,Flutter,Flutter Bloc,我尝试使用颤振阵型,因此我创建了以下阵型: class CategoriesBloc extends Bloc<CategoriesEvent, CategoriesState> { CategoriesBloc() : super(CategoriesInitial()); List<CategoriesItem> _catItems = [ CategoriesItem(id: 1, title: "Sugar", prefixIc
class CategoriesBloc extends Bloc<CategoriesEvent, CategoriesState> {
CategoriesBloc() : super(CategoriesInitial());
List<CategoriesItem> _catItems = [
CategoriesItem(id: 1, title: "Sugar", prefixIcon: Icons.access_alarms),
CategoriesItem(id: 2, title: "Calories", prefixIcon: Icons.access_alarms),
CategoriesItem(id: 3, title: "Salt", prefixIcon: Icons.access_alarms),
CategoriesItem(id: 4, title: "Fibre", prefixIcon: Icons.access_alarms),
CategoriesItem(id: 5, title: "Fat", prefixIcon: Icons.access_alarms)
];
List<CategoriesItem> get items => _catItems;
@override
Stream<CategoriesState> mapEventToState(
CategoriesEvent event,
) async* {
if (event is TopCategoriesEvent) {
yield* _makeCatList(items);
}
}
}
Stream<CategoriesState> _makeCatList(List<CategoriesItem> items) async* {
yield CategoriesStarted(items);
}
class CategoriesItem {
final int id;
final String title;
final IconData prefixIcon;
final IconData suffixIcon;
bool selected;
CategoriesItem(
{this.id,
this.title,
this.prefixIcon,
this.suffixIcon,
this.selected = false});
}
class CategoriesBloc扩展了Bloc{
CategoriesBloc():super(CategoriesInitial());
列表项=[
分类项(id:1,标题:“糖”,前缀:图标。访问报警),
分类项目(id:2,标题:“卡路里”,前缀:图标。访问报警),
分类项(id:3,标题:“Salt”,前缀:图标。访问报警),
分类项(id:4,标题:“光纤”,前缀:图标。访问报警),
分类项(id:5,标题:“Fat”,前缀:图标。访问\u报警)
];
列表获取项=>\u catItems;
@凌驾
流映射事件状态(
分类事件,
)异步*{
如果(事件为TopCategories事件){
产量*(项目);
}
}
}
流\u makeCatList(列表项)异步*{
已开始的收益分类(项目);
}
类分类项{
最终int id;
最后的字符串标题;
最终Iconda prefixIcon;
最终Iconda Sufficicon;
选择布尔;
分类项目(
{this.id,
这个名字,
这是我的名字,
这个,西贡,
this.selected=false});
}
现在,在主页中,我使用如下方式:
Container(
height: 80,
color: Colors.green[500],
child: BlocBuilder<CategoriesBloc, CategoriesState>(
builder: (context, state) {
if (state is CategoriesInitial) {
return Center(
child: CircularProgressIndicator(),
);
} else if (state is CategoriesStarted) {
return _makeCatItems(state.catItems);
}
return Container();
}),
state.tappedItems.contains(item)
? context.bloc<CategoriesBloc>().add(AddItem())
: context.bloc<CategoriesBloc>().add(RemoveItem()),
容器(
身高:80,
颜色:颜色。绿色[500],
孩子:BlocBuilder(
生成器:(上下文、状态){
if(状态为CategoriesInitial){
返回中心(
子对象:CircularProgressIndicator(),
);
}else if(状态为CategoriesStarted){
返回_makeCatItems(state.catItems);
}
返回容器();
}),
这是我的makeCatItems方法:
Widget _makeCatItems(List<CategoriesItem> catItems) {
print(catItems.length);
return Container(
margin: EdgeInsets.only(top: 8.0),
child: ListView(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
children: catItems
.map(
(item) => Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
InkWell(
onTap: () {},
child: Container(
width: 100,
height: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.0),
color: Colors.green[300],// change to white when tapped
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Icon(
item.prefixIcon,
color: Colors.white,
),
Text(
item.title,
style: TextStyle(color: Colors.white),
)
],
)),
),
SizedBox(
width: 16.0,
)
],
),
)
.toList(),
),
);
}
Widget\u makeCatItems(列表目录项){
打印(字长);
返回容器(
页边距:仅限边缘集(顶部:8.0),
子:ListView(
滚动方向:轴水平,
收缩膜:对,
儿童:catItems
.地图(
(项目)=>行(
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
墨水池(
onTap:(){},
子:容器(
宽度:100,
身高:40,
对齐:对齐.center,
装饰:盒子装饰(
边界半径:边界半径。圆形(8.0),
颜色:Colors.green[300],//点击时变为白色
),
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
图标(
第1.2项:,
颜色:颜色,白色,
),
正文(
项目名称,
样式:TextStyle(颜色:Colors.white),
)
],
)),
),
大小盒子(
宽度:16.0,
)
],
),
)
.toList(),
),
);
}
当用户以整体方式单击每个项目时,如何更改背景项目的颜色?您可以在状态中添加一个点击项目的列表,最初为空列表,添加一个在字段中传递项目的事件,并将BoxEncoration中的颜色更改为
状态。tappedItems.contains(项目)?Colors.white:Colors.green[300]
。您还需要更改onTap,如下所示:
Container(
height: 80,
color: Colors.green[500],
child: BlocBuilder<CategoriesBloc, CategoriesState>(
builder: (context, state) {
if (state is CategoriesInitial) {
return Center(
child: CircularProgressIndicator(),
);
} else if (state is CategoriesStarted) {
return _makeCatItems(state.catItems);
}
return Container();
}),
state.tappedItems.contains(item)
? context.bloc<CategoriesBloc>().add(AddItem())
: context.bloc<CategoriesBloc>().add(RemoveItem()),
所以您同时拥有状态和事件,现在bloc需要处理更改
@override
Stream<CategoriesState> mapEventToState(
CategoriesEvent event,
) async* {
if (event is TopCategoriesEvent) {
yield* _makeCatList(items);
} else if (event is CategoryAdded) {
yield CategoryState(state.items, state.pressedItems..add(event.item));
} else if (event is CategoryRemoved {
yield CategoryState(state.items, state.pressedItems..remove(event.item));
}
}
@覆盖
流映射事件状态(
分类事件,
)异步*{
如果(事件为TopCategories事件){
产量*(项目);
}else if(事件已分类添加){
收益分类状态(state.items,state.pressedItems..add(event.item));
}else if(事件类别已删除){
yield CategoryState(state.items,state.pressedItems..remove(event.item));
}
}
现在您的逻辑设置好了,现在您只需要更改小部件
Widget _makeCatItems() {
return BlocBuilder<CategoryBloc, CategoryState>(
builder: (context, state) => Container(
margin: EdgeInsets.only(top: 8.0),
child: ListView(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
children: catItems
.map(
(item) => Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
InkWell(
onTap: () {context.bloc<CategoryBloc>().add(state.pressedItems.contains(item) ? RemoveCategory(item) : AddCategory(item)},
child: Container(
width: 100,
height: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.0),
color: state.pressedItems.contains(item) ? Colors.white : Colors.green[300],
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Icon(
item.prefixIcon,
color: Colors.white,
),
Text(
item.title,
style: TextStyle(color: Colors.white),
)
],
)),
),
SizedBox(
width: 16.0,
)
],
),
)
.toList(),
),
);
);
}
Widget\u makeCatItems(){
返回BlocBuilder(
生成器:(上下文,状态)=>容器(
页边距:仅限边缘集(顶部:8.0),
子:ListView(
滚动方向:轴水平,
收缩膜:对,
儿童:catItems
.地图(
(项目)=>行(
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
墨水池(
onTap:(){context.bloc().add(state.pressedItems.contains(item)?RemoveCategory(item):AddCategory(item)},
子:容器(
宽度:100,
身高:40,
对齐:对齐.center,
装饰:盒子装饰(
边界半径:边界半径。圆形(8.0),
颜色:状态。按编辑。包含(项目)?颜色。白色:颜色。绿色[300],
),
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
图标(
第1.2项:,
颜色:颜色,白色,
),
正文(
项目名称,
样式:TextStyle(颜色:Colors.white),
)
],
)),
),
大小盒子(
宽度:16.0,
)
],
),
)
.toList(),