基础组件库
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.
 
 
 
 
 

130 lines
3.7 KiB

  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:provider/provider.dart';
  4. import 'package:pull_to_refresh/pull_to_refresh.dart';
  5. import 'package:zhiying_base_widget/pages/main_page/main_page_bloc.dart';
  6. import 'package:zhiying_base_widget/pages/main_page/main_page_notifier.dart';
  7. import 'package:zhiying_comm/util/base_bloc.dart';
  8. import 'package:zhiying_comm/zhiying_comm.dart';
  9. class MainPage extends StatefulWidget {
  10. final Map<String, dynamic> data;
  11. MainPage(
  12. this.data, {
  13. Key key,
  14. }) : super(key: key);
  15. @override
  16. _MainPageState createState() => _MainPageState();
  17. }
  18. class _MainPageState extends State<MainPage> {
  19. @override
  20. Widget build(BuildContext context) {
  21. return Scaffold(
  22. backgroundColor: Color(0xfff9f9f9),
  23. body: ChangeNotifierProvider(
  24. create: (context) => MainPageNotifier(),
  25. child: BlocProvider<MainPageBloc>(
  26. bloc: MainPageBloc(),
  27. child: _MainPageContainer(widget.data),
  28. ),
  29. ),
  30. );
  31. }
  32. }
  33. class _MainPageContainer extends StatefulWidget {
  34. final Map<String, dynamic> data;
  35. _MainPageContainer(this.data, {Key key}) : super(key: key);
  36. @override
  37. _MainPageContainerState createState() => _MainPageContainerState();
  38. }
  39. class _MainPageContainerState extends State<_MainPageContainer> {
  40. bool _isEnded = false;
  41. ScrollController _controller = ScrollController();
  42. MainPageBloc _bloc;
  43. RefreshController _refreshController =
  44. RefreshController(initialRefresh: false);
  45. void _onLoading() async {
  46. // await Future.delayed(Duration(milliseconds: 1000));
  47. // if (mounted) setState(() {});
  48. // _refreshController.loadComplete();
  49. }
  50. @override
  51. void dispose() {
  52. _controller.dispose();
  53. super.dispose();
  54. }
  55. @override
  56. void initState() {
  57. _bloc = BlocProvider.of<MainPageBloc>(context);
  58. _controller.addListener(() {
  59. // print('${_controller.offset} ${_controller.position.maxScrollExtent}');
  60. if (_controller.offset >= _controller.position.maxScrollExtent &&
  61. !_isEnded) {
  62. // 滑动到底部
  63. _isEnded = true;
  64. Provider.of<MainPageNotifier>(context, listen: false).loadMore();
  65. } else if (_controller.offset < _controller.position.maxScrollExtent &&
  66. _isEnded) {
  67. _isEnded = false;
  68. Provider.of<MainPageNotifier>(context, listen: false).reset();
  69. }
  70. });
  71. super.initState();
  72. }
  73. @override
  74. Widget build(BuildContext context) {
  75. return StreamBuilder<Map<String, dynamic>>(
  76. stream: _bloc.outData,
  77. builder: (BuildContext context, AsyncSnapshot snapshot) {
  78. return MediaQuery.removePadding(
  79. removeTop: true,
  80. context: context,
  81. child: SmartRefresher(
  82. enablePullDown: false,
  83. enablePullUp: false,
  84. header: WaterDropHeader(),
  85. controller: _refreshController,
  86. onLoading: _onLoading,
  87. child: CustomScrollView(
  88. controller: _controller,
  89. slivers: _createContent(context),
  90. ),
  91. ));
  92. },
  93. );
  94. }
  95. List<Widget> _createContent(BuildContext context) {
  96. WidgetModel model = WidgetModel.fromJson(widget.data);
  97. List<Widget> list = List();
  98. for (int i = 0; i < model.components.length; i++) {
  99. WidgetModel item = model.components[i];
  100. Map<String, dynamic> data = Map();
  101. if (widget.data.containsKey('components')) {
  102. data = widget.data['components'][i];
  103. }
  104. list.addAll(WidgetFactory.create(
  105. item.modName,
  106. type: WidgetType.skeleton,
  107. isSliver: true,
  108. model: data,
  109. ));
  110. }
  111. model.components.forEach((item) {});
  112. return list;
  113. }
  114. }