Reputation: 1
I tried to use FlutterFragment in AppCompatActivity,according to the api,I override the follow methods here is the code of my activity
public class MainActivity extends AppCompatActivity {
RadioButton rbTabHotspot;
RadioButton rbTabHome;
RadioButton rbTabDiscovery;
RadioButton rbTabMy;
RadioGroup rgNavigation;
int mCurrIndex = 0;
private FragmentManager mFragmentManager;
String[] tabSArray = new String[]{"home", "discovery", "hotspot","my"};
private ArrayList<String> mFragmentTags;
FlutterFragment flutterFragment;
@Override
public void onBackPressed() {
super.onBackPressed();
flutterFragment.onBackPressed();
}
@Override
protected void onPostResume() {
super.onPostResume();
flutterFragment.onPostResume();
}
@SuppressLint("ResourceType")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFragmentTags = new ArrayList<>(Arrays.asList(tabSArray));
mFragmentManager = getSupportFragmentManager();
flutterFragment = BridgetFragment
.withCachedEngine("mEngine")
.shouldAttachEngineToActivity(true)
.renderMode(RenderMode.texture)
.build();
setContentView(R.layout.activity_main);
rbTabDiscovery = findViewById(R.id.rb_tab_discovery);
rbTabHome = findViewById(R.id.rb_tab_home);
rbTabHotspot = findViewById(R.id.rb_tab_hotspot);
rbTabMy = findViewById(R.id.rb_tab_my);
rgNavigation = findViewById(R.id.rg_navigation);
initNavigation();
}
private void initNavigation() {
rgNavigation = findViewById(R.id.rg_navigation);
rgNavigation.setOnCheckedChangeListener((group, checkedId) -> {
switch (checkedId) {
case R.id.rb_tab_home:
mCurrIndex = 0;
showFragment();
break;
case R.id.rb_tab_discovery:
mCurrIndex = 1;
showFragment();
break;
case R.id.rb_tab_hotspot:
mCurrIndex = 2;
showFragment();
break;
case R.id.rb_tab_my:
mCurrIndex = 3;
showFragment();
break;
default:
mCurrIndex = 0;
showFragment();
break;
}
});
}
private void showFragment() {
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
Fragment fragment = mFragmentManager.findFragmentByTag(mFragmentTags.get(mCurrIndex));
if(mCurrIndex == 3){
fragment = flutterFragment;
}
if (fragment == null) {
fragment = instantFragment(mCurrIndex);
}
for (int i = 0; i < mFragmentTags.size(); i++) {
Fragment f = mFragmentManager.findFragmentByTag(mFragmentTags.get(i));
if (f != null && f != fragment && f.isAdded()) {
fragmentTransaction.hide(f);
}
}
if (fragment.isAdded()) {
fragmentTransaction.show(fragment);
} else {
fragmentTransaction.add(R.id.app_content, fragment, mFragmentTags.get(mCurrIndex));
}
fragmentTransaction.commitAllowingStateLoss();
mFragmentManager.executePendingTransactions();
}
private Fragment instantFragment(int currIndex) {
switch (currIndex) {
case 0:
return new HomeFragment();
case 1:
return new MediaFragment();
case 2:
return new HotFragment();
case 3:
return flutterFragment;
default:
return new HomeFragment();
}
}
@Override
protected void onPause() {
super.onPause();
flutterFragment.onPause();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
flutterFragment.onNewIntent(intent);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
flutterFragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
public void onUserLeaveHint() {
super.onUserLeaveHint();
flutterFragment.onUserLeaveHint();
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
flutterFragment.onTrimMemory(level);
}
}
but I got an error because of the onPostResume method
2021-04-20 10:20:21.901 16155-16155/com.wyx.myapplication E/AndroidRuntime: FATAL EXCEPTION: main Process: com.wyx.myapplication, PID: 16155 java.lang.RuntimeException: Unable to resume activity {com.wyx.myapplication/com.wyx.myapplication.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onPostResume()' on a null object reference at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4274) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4306) at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2048) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:227) at android.app.ActivityThread.main(ActivityThread.java:7582) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:953) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onPostResume()' on a null object reference at io.flutter.embedding.android.FlutterFragment.onPostResume(FlutterFragment.java:640) at com.wyx.myapplication.MainActivity.onPostResume(MainActivity.java:68) at android.app.Activity.performResume(Activity.java:8080) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4264) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4306) at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2048) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:227) at android.app.ActivityThread.main(ActivityThread.java:7582) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:953)
I do not know how to resolve this
Upvotes: 0
Views: 2235
Reputation: 39
I had the same issue, Seems like this is a problem in FlutterFragment class..
when you call flutterFragment.onPostResume(); inside of FlutterFragment the method onPostResume looks like this:
@ActivityCallThrough
public void onPostResume() {
delegate.onPostResume();
}
delegate seems to be null which causes the "null object reference"
this issue was reported to flutters github
Upvotes: 0