membership_page.dart 6.79 KB
import 'dart:async';
import 'dart:ui';

import 'package:Parlando/apis/api_response.dart';
import 'package:Parlando/base/base_state.dart';
import 'package:Parlando/extension/widget_ext.dart';
import 'package:Parlando/login/login_router.dart';
import 'package:Parlando/membership/models/membership_entity.dart';
import 'package:Parlando/membership/view_models/membership_view_model.dart';
import 'package:Parlando/payment/payment_sdk.dart';
import 'package:Parlando/payment/payment_service.dart';
import 'package:Parlando/res/constant.dart';
import 'package:Parlando/widgets/my_button.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flustars/flustars.dart';
import 'package:flutter/material.dart';
import 'package:Parlando/res/resources.dart';
import 'package:Parlando/routers/fluro_navigator.dart';
import 'package:Parlando/extension/int_extension.dart';
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart';
import 'package:getwidget/getwidget.dart';
import 'package:in_app_purchase_platform_interface/src/types/product_details.dart';
import 'package:provider/provider.dart';

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

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

class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingObserver {
  final List<ProductDetails> _products = <ProductDetails>[];

  Function? connectionCallBack;

  ApiResponse? apiResponse;

  @override
  void initState() {
    super.initState();
    PaymentSdk.instance.initState(onPaySuccess: () {
      hideLoading();
    }, onCancel: () {
      hideLoading();
    }, onFailed: () {
      hideLoading();
    }, onPending: () {
      toast("订单Pending");
    });
    PaymentSdk.instance.queryProducts().then((value) {
      _products.clear();
      _products.addAll(value);
      setState(() {});
    });
    if (SpUtil.containsKey(Constant.userToken)!) {
      showLoading();
      Provider.of<MembershipViewProvider>(context, listen: false).setSelectedMembership(null);
      Provider.of<MembershipViewProvider>(context, listen: false).fetchMembershipData('0');
    } else {
      NavigatorUtils.push(context, LoginRouter.loginPage, replace: true);
    }
  }

  @override
  Widget buildBody(BuildContext context) {
    ///响应数据
    apiResponse = Provider.of<MembershipViewProvider>(context).response;
    if (apiResponse?.status != Status.LOADING) {
      hideLoading();
    }

    ///写死背景加载会更快
    var url = "https://api.parlando.ink/storage/images/274d864a62d277b2a29c4db39f92d591.png";
    return Scaffold(
      body: Container(
        decoration: BoxDecoration(
          image: DecorationImage(image: CachedNetworkImageProvider(url), fit: BoxFit.fill),
        ),
        child: Column(
          children: [
            initBackBar(),
            const Spacer(),
            buildCompleteWidget(),
          ],
        ),
      ),
    );
  }

  ///底部一个磨砂玻璃区域
  Widget buildCompleteWidget() {
    MembershipData? mb = apiResponse?.data;
    return Container(
      height: MediaQuery.of(context).size.height / 2,
      decoration: BoxDecoration(
        color: Colors.grey.shade200.withOpacity(0.1),
        border: Border.all(color: Colors.grey.shade50, width: 0.5), // 边色与边宽度
      ),
      margin: const EdgeInsets.all(20),
      child: ClipRect(
        child: BackdropFilter(
          filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
          child: Container(
            decoration: BoxDecoration(color: Colors.grey.shade200.withOpacity(0.1)),
            child: Padding(
              padding: EdgeInsets.all(10.px),
              child: buildMemberContent(mb),
            ),
          ),
        ),
      ),
    );
  }

  ///会员内容区域
  buildMemberContent(MembershipData? mb) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Text(mb?.title ?? "一言会员", style: TextStyle(fontSize: 18.px, color: Colors.white)),
        Gaps.vGap24,
        mb?.goodsList?.isNotEmpty == true ? buildProductWidget(mb) : const GFLoader(),
        Gaps.vGap24,
        Text(mb?.intro ?? "一言介绍", style: TextStyle(fontSize: 14.px, color: Colors.white)),
        Gaps.vGap10,
        initOtherEntrance(),
      ],
    );
  }

  ///返回行为
  initBackBar() {
    return Container(
      alignment: Alignment.centerLeft,
      child: IconButton(
        onPressed: () {
          NavigatorUtils.goBack(context);
        },
        icon: const Icon(Icons.arrow_back_ios, color: Colors.white),
      ),
    );
  }

  ///购买项列表
  buildProductWidget(MembershipData? mb) {
    var widgets = mb?.goodsList?.map((e) => buildBuyItem(e)).toList() ?? [];
    return Column(children: widgets);
  }

  ///每一个购买项
  Widget buildBuyItem(MembershipDataGoodsList e) {
    ProductDetails? element;
    var detailList = _products.where((value) => value.id == e.iapId).toList();
    if (detailList.isNotEmpty) {
      element = detailList.first;
    }
    var style = const TextStyle(color: Colors.white);
    var button = Text("购买", style: style).paddingLeftRight(15).paddingTopBottom(8).click(() {
      showLoading();
      if (element != null) {
        PaymentSdk.instance.buy(element, e);
      }
    }, color: Colors.blue).round(radius: 10);
    return Row(
      mainAxisAlignment: MainAxisAlignment.end,
      children: [
        Text(buildBuyPrice(element, e), style: style),
        button,
      ],
    ).paddingLeftRight(10).paddingTopBottom(5);
  }

  ///价格字符串,优先使用商店的本地化价格
  String buildBuyPrice(ProductDetails? element, MembershipDataGoodsList e) {
    if (element == null) {
      return "${e.price}/${e.name}";
    }
    return "${element.price}/${e.name}";
  }

  ///其他入口区域
  Widget initOtherEntrance() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      mainAxisSize: MainAxisSize.min,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        TextButton(
          onPressed: () {},
          child: Text(
            "服务协议",
            style: TextStyle(fontSize: 14.px, color: Colors.white),
          ),
        ),
        Container(width: 0.6, height: 15.0, color: Colours.line),
        TextButton(
          onPressed: () {},
          child: Text(
            "隐私政策",
            style: TextStyle(fontSize: 14.px, color: Colors.white),
          ),
        ),
        Container(width: 0.6, height: 15.0, color: Colours.line),
        TextButton(
          onPressed: () {},
          child: Text(
            "恢复购买",
            style: TextStyle(fontSize: 14.px, color: Colors.white),
          ),
        ),
      ],
    );
  }

  @override
  void dispose() {
    PaymentSdk.instance.dispose();
    super.dispose();
  }
}