You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
4.9KB

  1. import 'package:farm_tpf/custom_model/Supply.dart';
  2. import 'package:farm_tpf/data/repository/repository.dart';
  3. import 'package:farm_tpf/presentation/custom_widgets/bottom_loader.dart';
  4. import 'package:farm_tpf/presentation/custom_widgets/loading_list_page.dart';
  5. import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart';
  6. import 'package:farm_tpf/presentation/screens/resources/bloc/supply_bloc.dart';
  7. import 'package:farm_tpf/presentation/screens/resources/widget_search.dart';
  8. import 'package:farm_tpf/utils/const_string.dart';
  9. import 'package:flutter/material.dart';
  10. import 'package:flutter_bloc/flutter_bloc.dart';
  11. import 'package:get/get.dart';
  12. import 'package:farm_tpf/utils/formatter.dart';
  13. class ResourceHelperScreen extends StatefulWidget {
  14. final String type;
  15. final int selectedId;
  16. final String titleName;
  17. ResourceHelperScreen(
  18. {@required this.type,
  19. @required this.selectedId,
  20. @required this.titleName});
  21. @override
  22. _ResourceHelperScreenState createState() => _ResourceHelperScreenState();
  23. }
  24. class _ResourceHelperScreenState extends State<ResourceHelperScreen> {
  25. @override
  26. Widget build(BuildContext context) {
  27. return BlocProvider(
  28. create: (context) => SupplyBloc(repository: Repository())
  29. ..add(DataFetched(type: widget.type, selectedId: widget.selectedId)),
  30. child: HoldInfinityWidget(
  31. selectedId: widget.selectedId,
  32. type: widget.type,
  33. titleName: widget.titleName,
  34. ),
  35. );
  36. }
  37. }
  38. class HoldInfinityWidget extends StatelessWidget {
  39. final int selectedId;
  40. final String type;
  41. final String titleName;
  42. HoldInfinityWidget(
  43. {@required this.selectedId,
  44. @required this.type,
  45. @required this.titleName});
  46. final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  47. @override
  48. Widget build(BuildContext context) {
  49. return Scaffold(
  50. key: _scaffoldKey,
  51. appBar: AppBar(title: Text("Chọn $titleName")),
  52. body: Column(
  53. children: <Widget>[
  54. WidgetSearch(
  55. type: type,
  56. selectedId: selectedId,
  57. ),
  58. Expanded(
  59. child: InfinityView(
  60. selectedId: selectedId,
  61. type: type,
  62. ))
  63. ],
  64. ));
  65. }
  66. }
  67. class InfinityView extends StatefulWidget {
  68. final int selectedId;
  69. final String type;
  70. InfinityView({@required this.selectedId, @required this.type});
  71. @override
  72. _InfinityViewState createState() => _InfinityViewState();
  73. }
  74. class _InfinityViewState extends State<InfinityView> {
  75. SupplyBloc _supplyBloc;
  76. @override
  77. void initState() {
  78. _supplyBloc = BlocProvider.of<SupplyBloc>(context);
  79. _supplyBloc
  80. .add(DataFetched(type: widget.type, selectedId: widget.selectedId));
  81. super.initState();
  82. }
  83. @override
  84. Widget build(BuildContext context) {
  85. return BlocBuilder<SupplyBloc, SupplyState>(
  86. builder: (context, state) {
  87. if (state is SupplyFailure) {
  88. return Center(child: Text(label_error_get_data));
  89. }
  90. if (state is SupplySuccess) {
  91. if (state.items.isEmpty) {
  92. return Center(child: Text(label_list_empty));
  93. }
  94. return RefreshIndicator(
  95. child: ListView.builder(
  96. itemBuilder: (BuildContext context, int index) {
  97. return index >= state.items.length
  98. ? BottomLoader()
  99. : ItemInfinityWidget(item: state.items[index]);
  100. },
  101. itemCount: state.items.length),
  102. onRefresh: () async {
  103. _supplyBloc.add(OnRefresh(
  104. type: widget.type, selectedId: widget.selectedId));
  105. });
  106. }
  107. return Center(
  108. child: LoadingListPage(),
  109. );
  110. },
  111. );
  112. }
  113. @override
  114. void dispose() {
  115. super.dispose();
  116. }
  117. }
  118. class ItemInfinityWidget extends StatelessWidget {
  119. final Supply item;
  120. const ItemInfinityWidget({Key key, @required this.item}) : super(key: key);
  121. @override
  122. Widget build(BuildContext context) {
  123. return GestureDetector(
  124. child: Card(
  125. child: Material(
  126. child: RadioListTile(
  127. title: Row(
  128. children: [
  129. Expanded(child: Text(item.tbSuppliesName.toString())),
  130. Text(
  131. "${item.quantity.formatNumtoStringDecimal()} ${item.unit}")
  132. ],
  133. ),
  134. subtitle: Text(item.tbWarehouseName.toString()),
  135. value: item,
  136. groupValue: item.isSelected == false ? null : item,
  137. onChanged: (Supply value) {
  138. if (value.quantity <= 0) {
  139. Utils.showSnackBarWarning(message: "Vật tư đã hết");
  140. } else {
  141. //close nackbar if open
  142. if (Get.isSnackbarOpen) Get.back();
  143. Navigator.of(context).pop(value);
  144. }
  145. }),
  146. )),
  147. onTap: () {});
  148. }
  149. }