membership_page.dart 10.5 KB
import 'dart:async';
import 'dart:io';
import 'dart:ui';

import 'package:Parlando/apis/api_response.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/res/constant.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:provider/provider.dart';

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

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

class MembershipPageState extends State<MembershipPage>
    with WidgetsBindingObserver {
  bool _isLoading = false;

  late StreamSubscription _purchaseUpdatedSubscription;
  late StreamSubscription _purchaseErrorSubscription;
  late StreamSubscription _conectionSubscription;
  final List<String> _productLists = Platform.isAndroid
      ? [
          'test.yiyan.vip.1.month',
        ]
      : ['test.yiyan.vip.1.month'];

  String _platformVersion = 'Unknown';
  List<IAPItem> _items = [];
  List<PurchasedItem> _purchases = [];

  @override
  void initState() {
    super.initState();
    if (SpUtil.containsKey(Constant.userToken)!) {
      Provider.of<MembershipViewProvider>(context, listen: false)
          .setSelectedMembership(null);
      Provider.of<MembershipViewProvider>(context, listen: false)
          .fetchMembershipData('0');

      initPlatformState();
    } else {
      NavigatorUtils.push(context, LoginRouter.loginPage, replace: true);
    }
  }

  @override
  Widget build(BuildContext context) {
    ApiResponse apiResponse =
        Provider.of<MembershipViewProvider>(context).response;
    switch (apiResponse.status) {
      case Status.LOADING:
        return const Center(child: CircularProgressIndicator());
      case Status.COMPLETED:
        MembershipData mb = apiResponse.data as MembershipData;
        return SafeArea(
          child: Scaffold(
            backgroundColor: Colors.black,
            body: Container(
              alignment: Alignment.topCenter,
              decoration: BoxDecoration(
                image: DecorationImage(
                  image: CachedNetworkImageProvider(mb.bgImages!),
                  fit: BoxFit.fill,
                ),
              ),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  Container(
                    alignment: Alignment.centerLeft,
                    child: IconButton(
                      onPressed: () {
                        NavigatorUtils.goBack(context);
                      },
                      icon: const Icon(
                        Icons.arrow_back_ios,
                        color: Colors.white,
                      ),
                    ),
                  ),
                  const Spacer(),
                  Container(
                    margin: EdgeInsets.symmetric(
                        vertical: 60.px, horizontal: 20.px),
                    height: MediaQuery.of(context).size.height / 2,
                    width: double.infinity,
                    decoration: BoxDecoration(
                      color: Colors.grey.shade200.withOpacity(0.1),
                      border: Border.all(
                        color: Colors.grey.shade50,
                        width: 0.5,
                      ), // 边色与边宽度
                    ),
                    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: Column(
                              crossAxisAlignment: CrossAxisAlignment.center,
                              children: [
                                Text(
                                  mb.title!,
                                  style: TextStyle(
                                    fontSize: 18.px,
                                    color: Colors.white,
                                  ),
                                ),
                                Gaps.vGap24,
                                // TODO 如果会员则显示会员详情
                                SizedBox(
                                  width: double.infinity,
                                  height: 100,
                                  child: Column(
                                    children: _renderInApps(),
                                  ),
                                ),
                                Gaps.vGap24,
                                Text(
                                  mb.intro!,
                                  style: TextStyle(
                                    fontSize: 14.px,
                                    color: Colors.white,
                                  ),
                                ),
                                Gaps.vGap10,
                                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,
                                        ),
                                      ),
                                    ),
                                  ],
                                ),
                              ],
                            ),
                          ),
                        ),
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        );
      case Status.ERROR:
        return Center(
          child: Text('暂时无法获取数据,请稍候再试!${apiResponse.message}'),
        );
      case Status.INITIAL:
      default:
        return const Center(
          child: Text('正在获取数据....'),
        );
    }
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {}

  @override
  void dispose() {
    _conectionSubscription.cancel();
    super.dispose();
  }

  Future<void> initPlatformState() async {
    String platformVersion;
    // Platform messages may fail, so we use a try/catch PlatformException.

    // prepare
    var result = await FlutterInappPurchase.instance.initialize();
    print('result: $result');

    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) return;

    setState(() {
      // _platformVersion = platformVersion;
    });

    // refresh items for android
    try {
      String msg = await FlutterInappPurchase.instance.consumeAll();
      print('consumeAllItems: $msg');
    } catch (err) {
      print('consumeAllItems error: $err');
    }

    _conectionSubscription =
        FlutterInappPurchase.connectionUpdated.listen((connected) {
      print('connected: $connected');
    });

    _purchaseUpdatedSubscription =
        FlutterInappPurchase.purchaseUpdated.listen((productItem) {
      print('purchase-updated: $productItem');
    });

    _purchaseErrorSubscription =
        FlutterInappPurchase.purchaseError.listen((purchaseError) {
      print('purchase-error: $purchaseError');
    });

    List<IAPItem> items =
        await FlutterInappPurchase.instance.getSubscriptions(_productLists);
    for (var item in items) {
      print('${item.toString()}');
      _items.add(item);
    }

    setState(() {
      _items = items;
      _purchases = [];
    });
  }

  List<Widget> _renderInApps() {
    List<Widget> widgets = <Widget>[];
    for (IAPItem item in _items) {
      widgets.add(Text(item.title!));
    }
    return widgets;
  }

  void _requestPurchase(IAPItem item) {
    FlutterInappPurchase.instance.requestPurchase(item.productId!);
  }
}