home_page.dart 6.9 KB
import 'dart:async';

import 'package:Parlando/poem/components/video_slides.dart';
import 'package:flutter/material.dart';
import 'package:getwidget/getwidget.dart';

import '../category/category_router.dart';
import '../events/trans_event.dart';
import '../net/dio_utils.dart';
import '../net/http_api.dart';
import '../routers/fluro_navigator.dart';
import 'package:flutter_easy_permission/easy_permissions.dart';

import '../util/toast_utils.dart';
import 'models/home_entity.dart';

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  HomeState createState() => HomeState();
}

class HomeState extends State<Home> with WidgetsBindingObserver {
  final PageController _controller = PageController();
  bool isLoading = false;
  int currentId = 0;
  int currentPage = 0;
  String currentPoemId = '';
  String currentPoemType = '';
  bool isFav = false;
  bool isPraise = false;
  bool isSharing = false;
  int cate = 0;

  late StreamSubscription bus;
  List<Widget> videos = [];

  static const permissions = [
    Permissions.CAMERA,
    Permissions.READ_EXTERNAL_STORAGE,
    Permissions.RECORD_AUDIO,
    Permissions.WRITE_EXTERNAL_STORAGE
  ];
  static const permissionGroup = [
    PermissionGroup.Camera,
    PermissionGroup.Camera,
    PermissionGroup.Microphone
  ];

  late FlutterEasyPermission _easyPermission;

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    bus.cancel();
    _easyPermission.dispose();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
    //设置pageView 滑动监听
    _controller.addListener(() {
      if (_controller.position.pixels == _controller.position.maxScrollExtent) {
        _getMore();
      }
    });

    FlutterEasyPermission.has(perms: permissions, permsGroup: permissionGroup)
        .then((value) {
      if (value) {
        FlutterEasyPermission.request(
            perms: permissions,
            permsGroup: permissionGroup,
            rationale: "需要使用如下权限");
      }
    });
    _easyPermission = FlutterEasyPermission()
      ..addPermissionCallback(onGranted: (requestCode, perms, perm) {
        debugPrint("android获得授权:$perms");
        debugPrint("iOS获得授权:$perm");
      }, onDenied: (requestCode, perms, perm, isPermanent) {
        if (isPermanent) {
          FlutterEasyPermission.showAppSettingsDialog(title: "Camera");
        } else {
          debugPrint("android授权失败:$perms");
          debugPrint("iOS授权失败:$perm");
        }
      }, onSettingsReturned: () {
        FlutterEasyPermission.has(perms: permissions, permsGroup: []).then(
            (value) => value
                ? debugPrint("已获得授权:$permissions")
                : debugPrint("未获得授权:$permissions"));
      });
    _onRefresh();
    bus = eventBus.on<TransEvent>().listen((event) {});
  }

  /// 下拉刷新方法,为list重新赋值
  Future<void> _onRefresh() async {
    isLoading = true;
    currentPage = 0;
    DioUtils.instance.asyncRequestNetwork<HomeEntity>(
      Method.get,
      cate == 0 ? HttpApi.home : HttpApi.fresh,
      params: {'page_size': 80},
      onSuccess: (data) {
        isLoading = false;
        videos.clear();
        for (HomeData data in data!.data!) {
          videos.add(VideoSlides(
            videoId: data.id!,
            poemId: data.poemId!,
            poemType: data.type!,
            url: data.url!,
            isCollect: data.isCollect!,
            isPraise: data.isPraise!,
          ));
        }
        setState(() {});
      },
      onError: (code, msg) {
        Toast.show("获取数据失败,请稍候再试...");
        isLoading = false;
      },
    );
  }

  /// 上拉加载更多
  Future<void> _getMore() async {
    currentPage += 1;
    isLoading = true;
    DioUtils.instance.asyncRequestNetwork<HomeEntity>(
      Method.get,
      cate == 0 ? HttpApi.home : HttpApi.fresh,
      params: {'page_size': 80, 'page': currentPage},
      onSuccess: (data) {
        isLoading = false;
        for (HomeData data in data!.data!) {
          videos.add(VideoSlides(
            videoId: data.id!,
            poemId: data.poemId!,
            poemType: data.type!,
            url: data.url!,
            isCollect: data.isCollect!,
            isPraise: data.isPraise!,
          ));
        }
        setState(() {});
      },
      onError: (code, msg) {
        Toast.show("获取数据失败,请稍候再试...");
        isLoading = false;
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        isLoading
            ? const GFLoader()
            : RefreshIndicator(
                //下拉刷新触发方法
                onRefresh: _onRefresh,
                //设置listView
                child: PageView(
                  onPageChanged: (p) {},
                  controller: _controller,
                  //设置滑动方向
                  scrollDirection: Axis.vertical,
                  children: videos,
                ),
              ),
        Positioned(
          top: 30.0,
          left: 10.0,
          right: 10.0,
          child: Center(
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                TextButton(
                  onPressed: () {
                    cate = 0;
                    setState(() {});
                    _onRefresh();
                  },
                  child: const Text(
                    "临境",
                    style: TextStyle(
                      color: Colors.white,
                      fontSize: 15,
                    ),
                  ),
                ),
                const Text(
                  "|",
                  style: TextStyle(color: Colors.white),
                ),
                TextButton(
                  onPressed: () {
                    eventBus.fire(TransEvent());
                    NavigatorUtils.push(
                      context,
                      CategoryRouter.categoryPage,
                    );
                  },
                  child: const Text(
                    "妙众",
                    style: TextStyle(
                      color: Colors.white,
                      fontSize: 15,
                    ),
                  ),
                ),
                const Text(
                  "|",
                  style: TextStyle(color: Colors.white),
                ),
                TextButton(
                  onPressed: () {
                    cate = 1;
                    setState(() {});
                    _onRefresh();
                  },
                  child: const Text(
                    "新鲜",
                    style: TextStyle(
                      color: Colors.white,
                      fontSize: 15,
                    ),
                  ),
                ),
              ],
            ),
          ),
        ),
      ],
    );
  }
}