import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:zhiying_base_widget/pages/main_page/main_page_bloc.dart'; import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_bg_notifier.dart'; import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_notifier.dart'; import 'package:zhiying_base_widget/widgets/others/mine_header_bg_widget.dart'; import 'package:zhiying_comm/util/base_bloc.dart'; import 'package:zhiying_comm/zhiying_comm.dart'; class MainPage extends StatefulWidget { final Map data; MainPage( this.data, { Key key, }) : super(key: key); @override _MainPageState createState() => _MainPageState(); } class _MainPageState extends State { @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Color(0xfff9f9f9), body: MultiProvider( providers: [ ChangeNotifierProvider.value(value: MainPageNotifier()), ChangeNotifierProvider.value(value: MainPageBgNotifier()), ], child: BlocProvider( bloc: MainPageBloc(), child: _MainPageContainer(widget.data), ), ), ); } } class _MainPageContainer extends StatefulWidget { final Map data; _MainPageContainer(this.data, {Key key}) : super(key: key); @override _MainPageContainerState createState() => _MainPageContainerState(); } class _MainPageContainerState extends State<_MainPageContainer> { bool _isEnded = false; ScrollController _controller = ScrollController(); MainPageBloc _bloc; RefreshController _refreshController = RefreshController(initialRefresh: false); void _onLoading() async { // await Future.delayed(Duration(milliseconds: 1000)); // if (mounted) setState(() {}); // _refreshController.loadComplete(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override void initState() { _bloc = BlocProvider.of(context); if (widget.data.containsKey('mod_id')) { _bloc.loadData(widget.data['mod_id']); } _controller.addListener(() { // print('${_controller.offset} ${_controller.position.maxScrollExtent}'); if (_controller.offset >= _controller.position.maxScrollExtent && !_isEnded) { // 滑动到底部 _isEnded = true; Provider.of(context, listen: false).loadMore(); } else if (_controller.offset < _controller.position.maxScrollExtent && _isEnded) { _isEnded = false; Provider.of(context, listen: false).reset(); } }); super.initState(); } @override Widget build(BuildContext context) { return MediaQuery.removePadding( removeTop: true, context: context, child: SmartRefresher( enablePullDown: true, enablePullUp: false, header: WaterDropHeader(), controller: _refreshController, onLoading: _onLoading, child: Container( width: double.infinity, child: StreamBuilder>>( stream: _bloc.outData, builder: (BuildContext context, AsyncSnapshot snapshot) { return Stack( fit: StackFit.passthrough, children: [ MineHeaderBgWidget( controller: _controller, ), CustomScrollView( controller: _controller, slivers: _createContent(context, snapshot.data ?? []), ) ], ); }, ), )), ); } List _createContent( BuildContext context, List> datas) { List list = List(); for (int i = 0; i < datas.length; i++) { WidgetModel item = WidgetModel.fromJson(Map.from(datas[i])); print('item.modName ${item.modName}'); list.addAll(WidgetFactory.create( item.modName, isSliver: true, model: datas[i], )); } print('生成列表widget个数 ${list.length}'); if (list.length <= 0) { list.add(SliverToBoxAdapter( child: Container( height: 200, child: Center( child: Text('暂时无数据哦~'), ), ), )); } return list; } }