|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- import 'dart:convert';
- import 'dart:ui';
-
- 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/home/home_auth/home_auth.dart';
- import 'package:zhiying_base_widget/widgets/mine/mine_nav/mine_nav_bg.dart';
- import 'package:zhiying_base_widget/widgets/others/mine_header_bg_widget.dart';
- import 'package:zhiying_base_widget/widgets/refresh/refresh_header/refresh_header.dart';
- import 'package:zhiying_comm/util/base_bloc.dart';
- import 'package:zhiying_comm/zhiying_comm.dart';
-
- class MainPage extends StatefulWidget {
- final Map<String, dynamic> data;
-
- MainPage(
- this.data, {
- Key key,
- }) : super(key: key);
-
- @override
- _MainPageState createState() => _MainPageState();
- }
-
- class _MainPageState extends State<MainPage> {
- @override
- Widget build(BuildContext context) {
- return MultiProvider(
- providers: [
- ChangeNotifierProvider.value(value: MainPageNotifier()),
- ChangeNotifierProvider.value(value: MainPageBgNotifier()),
- ],
- child: BlocProvider<MainPageBloc>(
- bloc: MainPageBloc(),
- child: _MainPageContainer(widget.data),
- ),
- );
- }
- }
-
- class _MainPageContainer extends StatefulWidget {
- final Map<String, dynamic> 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);
-
- Widget _floatWidget;
-
- void _onLoading() async {
- // await Future.delayed(Duration(milliseconds: 1000));
- // if (mounted) setState(() {});
- // _refreshController.loadComplete();
- }
-
- void _onRefresh() async {
- // await Future.delayed(Duration(milliseconds: 3000));
- // _refreshController.refreshCompleted();
-
- if (widget.data.containsKey('skip_identifier')) {
- _bloc.loadData(widget.data['skip_identifier']);
- }
- }
-
- @override
- void dispose() {
- _controller.dispose();
- _refreshController.dispose();
- super.dispose();
- }
-
- @override
- void initState() {
- _bloc = BlocProvider.of<MainPageBloc>(context);
- if (widget.data.containsKey('skip_identifier')) {
- _bloc.loadData(widget.data['skip_identifier']);
- }
-
- _controller.addListener(() {
- // print('${_controller.offset} ${_controller.position.maxScrollExtent}');
- if (_controller.offset >= _controller.position.maxScrollExtent && !_isEnded) {
- // 滑动到底部
- _isEnded = true;
- Provider.of<MainPageNotifier>(context, listen: false).loadMore();
- } else if (_controller.offset < _controller.position.maxScrollExtent && _isEnded) {
- _isEnded = false;
- Provider.of<MainPageNotifier>(context, listen: false).reset();
- }
- });
-
- super.initState();
- }
-
- @override
- Widget build(BuildContext context) {
- double top = MediaQueryData.fromWindow(window).padding.top;
- return StreamBuilder<List<Map<String, dynamic>>>(
- stream: _bloc.outData,
- builder: (BuildContext context, AsyncSnapshot snapshot) {
- List widgets = _createContent(context, snapshot.data ?? []);
- _refreshController.refreshCompleted();
- Widget bgWidget = validateBgWidget(context, snapshot.data ?? []);
- return Scaffold(
- backgroundColor: Color(0xfff9f9f9),
- floatingActionButton: _floatWidget,
- floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
- body: MediaQuery.removePadding(
- removeTop: true,
- context: context,
- child: Container(
- width: double.infinity,
- child: Stack(
- fit: StackFit.passthrough,
- children: <Widget>[
- MineHeaderBgWidget(
- bgWidget: bgWidget,
- controller: _controller,
- ),
- SmartRefresher(
- enablePullDown: true,
- enablePullUp: false,
- header: RefreshHeader(
- offsetY: top,
- ),
- controller: _refreshController,
- onLoading: _onLoading,
- onRefresh: _onRefresh,
- child: CustomScrollView(
- controller: _controller,
- slivers: widgets,
- ),
- )
- ],
- ),
- ),
- ),
- );
- });
- }
-
- List<Widget> _createContent(BuildContext context, List<Map<String, dynamic>> datas) {
- List<Widget> list = List();
- for (int i = 0; i < datas.length; i++) {
- WidgetModel item = WidgetModel.fromJson(Map<String, dynamic>.from(datas[i]));
-
- print('item.modName ${item.modName}');
- if (item.modName == 'index_taobao_auth_tip') {
- _floatWidget = HomeAuth(datas[i]);
- continue;
- }
- list.addAll(WidgetFactory.create(
- item.modName,
- isSliver: true,
- model: datas[i],
- ));
- }
- if (list.length <= 0) {
- list.add(SliverToBoxAdapter(
- child: Container(
- height: 200,
- // child: Center(
- // child: Text('暂时无数据哦~'),
- // ),
- ),
- ));
- }
- return list;
- }
-
-
-
- ///处理特殊背景图
- Widget validateBgWidget(BuildContext context, List<Map<String, dynamic>> datas) {
- for (int i = 0; i < datas.length; i++) {
- WidgetModel item = WidgetModel.fromJson(Map<String, dynamic>.from(datas[i]));
- if (item.modName == "profile_background") {
- final double statusBarHeight = MediaQuery.of(context).padding.top;
- String url=json.decode(item.data)['img'];
- return Container(
- width: double.infinity,
- height: statusBarHeight + 250,
- child: CachedNetworkImage(
- imageUrl: url,
- fit: BoxFit.fitHeight,
- ),
- );
- }
- }
- return null;
- }
- }
|