基础组件库
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 

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