首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >in_app_purchase purchaseUpdatedStream侦听事件未触发

in_app_purchase purchaseUpdatedStream侦听事件未触发
EN

Stack Overflow用户
提问于 2020-05-01 00:12:12
回答 1查看 96关注 0票数 0

我想在我的应用程序初始化后订阅purchaseUpdatedStream事件,因为如果购买失败,我想访问本地化文本以向用户显示消息。但是,我无法触发listen事件,除非在构建MaterialApp小部件之前订阅它。

工作示例:

代码语言:javascript
复制
class AppConfig extends InheritedWidget {
  AppConfig({
    @required this.appName,
    @required Widget child,
    @required this.prefs,
    @required this.devMode
  }) : super(child: child);

  final String appName;
  final SharedPreferences prefs;
  final bool devMode;

  static AppConfig of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType();
  }

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) => false;
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  var configuredApp = new AppConfig(
    appName: 'app',
    child: new MyApp(),
    prefs: await SharedPreferences.getInstance(),
    devMode: true,
  );

  InAppPurchaseConnection.enablePendingPurchases();
  runApp(configuredApp);
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  StreamSubscription<List<PurchaseDetails>> _subscription;

  @override
  void initState() {
    Stream purchaseUpdated =
        InAppPurchaseConnection.instance.purchaseUpdatedStream;
    _subscription = purchaseUpdated.listen((purchaseDetailsList) {
      _listenToPurchaseUpdated(purchaseDetailsList, context);
    }, onDone: () {
      _subscription.cancel();
    }, onError: (error) {
      // handle error here.
    });
    super.initState();
  }

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

  void _listenToPurchaseUpdated(List<PurchaseDetails> purchaseDetailsList, BuildContext context) {
    var config = AppConfig.of(context);
    purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
      if (purchaseDetails.status == PurchaseStatus.pending) {
        print('pending');
      } else {
        if (purchaseDetails.status == PurchaseStatus.error) {
          print('error');
        } else if (purchaseDetails.status == PurchaseStatus.purchased) {
          print('purchased');
        }
        if (purchaseDetails.pendingCompletePurchase) {
          print('complete');
          await InAppPurchaseConnection.instance
              .completePurchase(purchaseDetails);
        }
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    var config = AppConfig.of(context);

    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);

    return MultiProvider(
      providers: [
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        title: config.appName,
        home: Scaffold(
          body: SomeWidget(); // whack a button in this widget that triggers a product purchase
        ),
      )
    );
  }
}

非工作示例:

代码语言:javascript
复制
class AppConfig extends InheritedWidget {
  AppConfig({
    @required this.appName,
    @required Widget child,
    @required this.prefs,
    @required this.devMode
  }) : super(child: child);

  final String appName;
  final SharedPreferences prefs;
  final bool devMode;

  static AppConfig of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType();
  }

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) => false;
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  var configuredApp = new AppConfig(
    appName: 'app',
    child: new AppScaffold(),
    prefs: await SharedPreferences.getInstance(),
    devMode: true,
  );

  InAppPurchaseConnection.enablePendingPurchases();
  runApp(configuredApp);
}

class AppScaffold extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var config = AppConfig.of(context);

    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);

    return MultiProvider(
      providers: [
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        title: config.appName,
        home: Scaffold(
          body: MyApp()
        ),
      )
    );
  }
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  StreamSubscription<List<PurchaseDetails>> _subscription;

  @override
  void initState() {
    Stream purchaseUpdated =
        InAppPurchaseConnection.instance.purchaseUpdatedStream;
    _subscription = purchaseUpdated.listen((purchaseDetailsList) {
      _listenToPurchaseUpdated(purchaseDetailsList, context);
    }, onDone: () {
      _subscription.cancel();
    }, onError: (error) {
      // handle error here.
    });
    super.initState();
  }

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

  void _listenToPurchaseUpdated(List<PurchaseDetails> purchaseDetailsList, BuildContext context) {
    var config = AppConfig.of(context);
    purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
      if (purchaseDetails.status == PurchaseStatus.pending) {
        print('pending');
      } else {
        if (purchaseDetails.status == PurchaseStatus.error) {
          print('error');
        } else if (purchaseDetails.status == PurchaseStatus.purchased) {
          print('purchased');
        }
        if (purchaseDetails.pendingCompletePurchase) {
          print('complete');
          await InAppPurchaseConnection.instance
              .completePurchase(purchaseDetails);
        }
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return SomeWidget(); // whack a button in this widget that triggers a product purchase
  }
}

有没有人能看看我是不是走错了路,或者解释一下为什么这个方法不起作用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-01 20:00:48

我自己的错误-我在应用程序中的其他地方使用了Navigator.pushReplacement(...);,这将触发子小部件上的dispose方法。很明显,现在我在想这件事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61527911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档