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