確かに、アプリ全体の初期化処理の中でトランザクションオブザーバを設定する場合、購入情報を処理するコードとの間にアクセスの障壁が生じる可能性があります。
この問題を解決するために、以下のような方法があります。
import 'package:in_app_purchase/in_app_purchase.dart';
// 購入情報を処理するコールバック typedef void PurchaseCallback(PurchaseDetails purchaseDetails); class MyApp extends StatelessWidget { // コールバックを格納するリスト final List<PurchaseCallback> _purchaseCallbacks = []; // コールバックを追加するメソッド void addPurchaseCallback(PurchaseCallback callback) { _purchaseCallbacks.add(callback); } // 購入情報を処理するメソッド void _handlePurchaseUpdate(PurchaseDetails purchaseDetails) { // 登録されたコールバックをすべて呼び出す for (final callback in _purchaseCallbacks) { callback(purchaseDetails); } } // トランザクションオブザーバを設定するメソッド void _initializeInAppPurchases() { InAppPurchaseConnection.instance .purchaseUpdatedStream .listen(_handlePurchaseUpdate); // トランザクションオブザーバが設定されたら、登録されたコールバックを呼び出す for (final callback in _purchaseCallbacks) { callback(null); } } @override Widget build(BuildContext context) { return MaterialApp( title: 'MyApp', home: MyHomePage(), ); } } class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { final appState = Provider.of<AppState>(context); // 購入情報を処理するコードを登録する appState.addPurchaseCallback((purchaseDetails) { // 購入情報を処理するコードをここに記述する }); return Scaffold( appBar: AppBar( title: Text('MyApp'), ), body: Center( child: Text('Hello, World!'), ), ); } }