0

我在 Flutter 模块中使用in_app_purchase包,然后在原生 android 应用程序中作为Flutter Fragment !当我们第一次启动 Flutter 屏幕并购买时它工作正常,但如果我们回到原生活动并重新打开 Flutter 屏幕并尝试购买商品,则会出现以下错误!

PlatformException(不可用,BillingClient 未设置。尝试重新连接。,null,null)

这是我在应用程序中的流程:

  1. 使用本机活动启动的应用程序
  2. 启动了另一个扩展片段活动的活动
  3. 在 Fragment Activity 中,我正在添加 FlutterFragment
  4. 如自述文件中所述,在 Flutter 屏幕内部初始化 in_app_purchase。
  5. 购买消耗品并获得成功。
  6. 启动flutter屏幕的初始页面(在flutter模块内部)
  7. 通过关闭持有 Flutter Fragment 的 Fragment Activity 回到原生 Activity。
  8. 再次导航到 Fragment Activity 并添加 Flutter Fragment 然后再次尝试购买消耗品。

它显示了上述错误!

扩展 FragmentActivity 的另一个 Activity 的代码

public class FlutterStoreActivity extends FragmentActivity {

    MethodChannel channel;

    FlutterEngine storeEngine;
    FlutterFragment flutterFragment;
    DrawerLayout drawerLayout;
    RelativeLayout profileRoot, homeRoot;
    MainDrawerFragment drawerFragment;
    String TAG_FLUTTER_FRAGMENT = "flutterStoreFragmentTag";
    TextView titleView;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.flutter_store_layout);

        homeRoot = findViewById(R.id.flutterStoreHomeButton);
        titleView = findViewById(R.id.flutterStoreTitle);
        profileRoot = findViewById(R.id.flutterStoreRelative);

        homeRoot.setOnClickListener((v)-> channel.invokeMethod("gotoHome", ""));
        profileRoot.setOnClickListener((v) -> openDrawer());


        drawerLayout = findViewById(R.id.flutterStoreDrawer);
        FragmentManager fragmentManager = getSupportFragmentManager();
        drawerFragment = new MainDrawerFragment();
        fragmentManager.beginTransaction().replace(R.id.flutterStoreNavFragment, drawerFragment, "drawerFragment").commit();

        flutterFragment = (FlutterFragment) fragmentManager.findFragmentByTag(TAG_FLUTTER_FRAGMENT);

       // if (flutterFragment == null) {

            storeEngine = FlutterEngineCache.getInstance().get(MyApplication.FLUTTER_ENGINE_KEY);
            flutterFragment = FlutterFragment.withCachedEngine(MyApplication.FLUTTER_ENGINE_KEY)
                    .renderMode(RenderMode.texture).build();
            MyApplication myApplication = MyApplication.getInstance();
            channel = new MethodChannel(storeEngine.getDartExecutor().getBinaryMessenger(), "my.flutter.channel");
            channel.setMethodCallHandler((call,result)->{

                @SuppressWarnings("unchecked") List<Object> params = (List<Object>)call.arguments;
                System.out.println("Called Method: "+call.method+" and params are "+params);

                switch (call.method){

                    case "tabChanged": {
                        titleView.setText(params.get(0).toString());
                        if(params.size()>1 && (boolean)params.get(1)){
                            FlutterStoreActivity.this.finish();
                        }
                        break;
                    }
                    
                }
            });
            fragmentManager.beginTransaction().add(R.id.flutterStoreFragment, flutterFragment, TAG_FLUTTER_FRAGMENT).commit();
        //}
    }



    public void openDrawer() {
        drawerLayout.openDrawer(GravityCompat.END);
        drawerLayout.bringToFront();
    }


    @Override
    public void onPostResume() {
        super.onPostResume();
        if (flutterFragment != null)
            flutterFragment.onPostResume();
    }

    @Override
    protected void onNewIntent(@NonNull Intent intent) {
        super.onNewIntent(intent);
        if (flutterFragment != null)
            flutterFragment.onNewIntent(intent);
    }

    @Override
    public void onBackPressed() {
        if (flutterFragment != null)
            flutterFragment.onBackPressed();
    }

    @Override
    public void onRequestPermissionsResult(
            int requestCode,
            @NonNull String[] permissions,
            @NonNull int[] grantResults
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (flutterFragment != null)
            flutterFragment.onRequestPermissionsResult(
                    requestCode,
                    permissions,
                    grantResults
            );
    }

    @Override
    public void onUserLeaveHint() {
        if (flutterFragment != null)
            flutterFragment.onUserLeaveHint();
    }

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (flutterFragment != null)
            flutterFragment.onTrimMemory(level);
    }
}

Flutter Fragment 中 gotHome 的代码(模块/AAR)

channel.setMethodCallHandler((call) async {
      if (call.method == 'gotoHome') {
        context.read(internetListener).restartModule();
      }
    });

context.read.... 是一个更改通知器,它位于小部件树的顶部声明中。所以它不会被各州重建,它的代码是

restartModule(){
    restart = true;
    notifyListeners();
    Future.delayed(const Duration(milliseconds: 300),(){
      restart = false;
      notifyListeners();
      SystemChannels.platform.invokeMethod('SystemNavigator.pop');
    });
  }
4

0 回答 0