Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Flatter bloc:轻触时更改每个项目的颜色_Flutter_Flutter Bloc - Fatal编程技术网

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(),