我在 Flutter 模块中使用in_app_purchase包,然后在原生 android 应用程序中作为Flutter Fragment !当我们第一次启动 Flutter 屏幕并购买时它工作正常,但如果我们回到原生活动并重新打开 Flutter 屏幕并尝试购买商品,则会出现以下错误!
PlatformException(不可用,BillingClient 未设置。尝试重新连接。,null,null)
这是我在应用程序中的流程:
- 使用本机活动启动的应用程序
- 启动了另一个扩展片段活动的活动
- 在 Fragment Activity 中,我正在添加 FlutterFragment
- 如自述文件中所述,在 Flutter 屏幕内部初始化 in_app_purchase。
- 购买消耗品并获得成功。
- 启动flutter屏幕的初始页面(在flutter模块内部)
- 通过关闭持有 Flutter Fragment 的 Fragment Activity 回到原生 Activity。
- 再次导航到 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');
});
}