import 'package:farm_tpf/custom_model/SuppliesUsing.dart'; import 'package:farm_tpf/custom_model/Supply.dart'; import 'package:farm_tpf/data/repository/repository.dart'; import 'package:farm_tpf/presentation/custom_widgets/app_bar_widget.dart'; import 'package:farm_tpf/presentation/custom_widgets/bottom_loader.dart'; import 'package:farm_tpf/presentation/custom_widgets/loading_list_page.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart'; import 'package:farm_tpf/presentation/screens/resources/bloc/supply_bloc.dart'; import 'package:farm_tpf/presentation/screens/resources/widget_search.dart'; import 'package:farm_tpf/utils/const_string.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:get/get.dart'; import 'package:farm_tpf/utils/formatter.dart'; class ResourceHelperScreen extends StatefulWidget { final String type; final int selectedId; final String titleName; final List currentItems; final int currentEditId; ResourceHelperScreen( {@required this.type, @required this.selectedId, @required this.titleName, @required this.currentItems, @required this.currentEditId}); @override _ResourceHelperScreenState createState() => _ResourceHelperScreenState(); } class _ResourceHelperScreenState extends State { @override Widget build(BuildContext context) { return BlocProvider( create: (context) => SupplyBloc(repository: Repository()) ..add(DataFetched(type: widget.type, selectedId: widget.selectedId)), child: HoldInfinityWidget( selectedId: widget.selectedId, type: widget.type, titleName: widget.titleName, currentItems: widget.currentItems, currentEditId: widget.currentEditId, ), ); } } class HoldInfinityWidget extends StatelessWidget { final int selectedId; final String type; final String titleName; final List currentItems; final int currentEditId; HoldInfinityWidget( {@required this.selectedId, @required this.type, @required this.titleName, @required this.currentItems, @required this.currentEditId}); final GlobalKey _scaffoldKey = new GlobalKey(); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, key: _scaffoldKey, appBar: AppBarWidget(), body: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.all(8.0), child: Text( '$titleName', style: TextStyle(fontWeight: FontWeight.w500, fontSize: 22), ), ), WidgetSearch( type: type, selectedId: selectedId, ), Expanded( child: InfinityView( selectedId: selectedId, type: type, currentItems: currentItems, currentEditId: currentEditId, )) ], )); } } class InfinityView extends StatefulWidget { final int selectedId; final String type; final List currentItems; final int currentEditId; InfinityView( {@required this.selectedId, @required this.type, @required this.currentItems, @required this.currentEditId}); @override _InfinityViewState createState() => _InfinityViewState(); } class _InfinityViewState extends State { SupplyBloc _supplyBloc; @override void initState() { _supplyBloc = BlocProvider.of(context); _supplyBloc .add(DataFetched(type: widget.type, selectedId: widget.selectedId)); super.initState(); } @override Widget build(BuildContext context) { return BlocBuilder( builder: (context, state) { if (state is SupplyFailure) { return Center(child: Text(label_error_get_data)); } if (state is SupplySuccess) { if (state.items.isEmpty) { return Center(child: Text(label_list_empty)); } return RefreshIndicator( child: ListView.builder( itemBuilder: (BuildContext context, int index) { return index >= state.items.length ? BottomLoader() : ItemInfinityWidget( item: state.items[index], currentItems: widget.currentItems, currentEditId: widget.currentEditId, ); }, itemCount: state.items.length), onRefresh: () async { _supplyBloc.add(OnRefresh( type: widget.type, selectedId: widget.selectedId)); }); } return Center( child: LoadingListPage(), ); }, ); } @override void dispose() { super.dispose(); } } class ItemInfinityWidget extends StatelessWidget { final Supply item; final List currentItems; final int currentEditId; const ItemInfinityWidget( {Key key, @required this.item, @required this.currentItems, @required this.currentEditId}) : super(key: key); @override Widget build(BuildContext context) { return GestureDetector( child: Container( decoration: BoxDecoration( border: Border( bottom: BorderSide(color: Colors.grey, width: 0.35))), child: RadioListTile( title: Row( children: [ Expanded(child: Text(item.tbSuppliesName.toString())), Text( "${item.quantity.formatNumtoStringDecimal()} ${item.unit}") ], ), subtitle: Text(item.tbWarehouseName.toString()), value: item, groupValue: item.isSelected == false ? null : item, onChanged: (Supply value) { if (value.quantity <= 0) { Utils.showSnackBarWarning(message: "Vật tư đã hết"); } else { var editedId = (currentEditId > 0) ? currentEditId : -1; if (currentItems .map((e) => e.tbSuppliesInWarehouseId) .contains(item.id) && item.id != editedId) { Utils.showSnackBarWarning( message: "Vật tư đã được thêm, vui lòng chọn vật tư khác"); } else { //close nackbar if open if (Get.isSnackbarOpen) Get.back(); Navigator.of(context).pop(value); } } })), onTap: () {}); } }