flutter / flutter

Flutter makes it easy and fast to build beautiful apps for mobile and beyond
https://flutter.dev
BSD 3-Clause "New" or "Revised" License
164.54k stars 27.13k forks source link

Flutter activity is not finished after all routes are popped #69956

Open timnew opened 3 years ago

timnew commented 3 years ago

I'm adding a few new screens built with Flutter onto an exiting Android app with a pre-warmed engine. Everything works so smoothly until I tried to close the UI from the flutter side.

In stand-alone flutter app, when all routes popped from the root Navigator, the app is closed automatically. But in this app, the app popped into a funny screen.

This is the home or the MaterialApp image

When I clicked Exit, it runs Navigator.pop(context);

I was expecting the FlutterActivity is finished, but it doesn't, and this is what I see on the screen: image This is the same screen captured the by emulator screenshot tool, which is a blank screen image

I can leave this screen by press physical back, I can return to my native screen.

If I re-show the flutter screen again, I would see image It renders a transparent view on it, but you can still see flutter debug ribbon.

If I triggers hot reload right now, I can see logs:

Performing hot reload...
Syncing files to device Android SDK built for x86...

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building Navigator-[GlobalObjectKey<NavigatorState>
_WidgetsAppState#a6a87](dirty, dependencies: [HeroControllerScope], state:
NavigatorState#a52a8(tickers: tracking 0 tickers)):
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 4042 pos 12:
'_history.isNotEmpty': is not true.

Either the assertion indicates an error in the framework itself, or we should provide substantially
more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md

The relevant error-causing widget was:
  MaterialApp
  file:///Users/timnew/Workspace/mobile-android/flutter_module/lib/screens/app/JoraApp.dart:28:12

When the exception was thrown, this was the stack:
#2      NavigatorState.build (package:flutter/src/widgets/navigator.dart:4042:12)
#3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4744:28)
#4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4627:15)
#5      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#6      Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#7      StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
#8      Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#9      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#10     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#11     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#12     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#13     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#14     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#15     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#16     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#17     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#18     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#19     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#20     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#21     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#22     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#23     StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
#24     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#25     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#26     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#27     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#28     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#29     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#30     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#31     StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
#32     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#33     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#34     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#35     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#36     StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
#37     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#38     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#39     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#40     StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
#41     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#42     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#43     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#44     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#45     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#46     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6125:14)
#47     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#48     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#49     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#50     StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
#51     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#52     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#53     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#54     StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
#55     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#56     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#57     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#58     StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
#59     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#60     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#61     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#62     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#63     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#64     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#65     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#66     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#67     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#68     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6125:14)
#69     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#70     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#71     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#72     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#73     StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
#74     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#75     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#76     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#77     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#78     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#79     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#80     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#81     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#82     StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
#83     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#84     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#85     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#86     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#87     _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:183:11)
#88     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#89     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#90     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#91     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#92     StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
#93     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#94     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#95     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#96     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#97     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#98     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#99     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#100    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#101    StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
#102    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#103    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#104    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#105    ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#106    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#107    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#108    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#109    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#110    StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
#111    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#112    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#113    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#114    ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#115    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:183:11)
#116    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#117    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6125:14)
#118    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#119    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#120    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#121    ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#122    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:183:11)
#123    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#124    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#125    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#126    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#127    StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
#128    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#129    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#130    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#131    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#132    StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
#133    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#134    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#135    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#136    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#137    StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
#138    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#139    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#140    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#141    ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#142    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#143    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#144    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#145    ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
#146    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#147    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#148    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#149    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#150    StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
#151    Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
#152    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
#153    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#154    Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
#155    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2730:33)
#156    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:913:20)
#157    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:302:5)
#158    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1117:15)
#159    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1055:9)
#160    SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:864:7)
(elided 6 frames from class _AssertionError, class _RawReceivePortImpl, class _Timer, and dart:async-patch)

════════════════════════════════════════════════════════════════════════════════════════════════════
Reloaded 0 of 577 libraries in 371ms.

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown building Navigator-[GlobalObjectKey<NavigatorState> _WidgetsAppState#a6a87](dirty, dependencies: [HeroControllerScope], state: NavigatorState#a52a8(tickers: tracking 0 tickers)):
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 4042 pos 12: '_history.isNotEmpty': is not true.

Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md

The relevant error-causing widget was: 
  MaterialApp file:///Users/timnew/Workspace/mobile-android/flutter_module/lib/screens/app/JoraApp.dart:28:12
When the exception was thrown, this was the stack: 
#2      NavigatorState.build (package:flutter/src/widgets/navigator.dart:4042:12)
#3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4744:28)
#4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4627:15)
#5      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#6      Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
...
════════════════════════════════════════════════════════════════════════════════════════════════════

Steps to Reproduce

This is flutter side code

class FlutterApp extends StatefulWidget {
  @override
  _FlutterAppState createState() => _FlutterAppState();
}

class _FlutterAppState extends State<FlutterApp> {
  final routeRemoteController = RouteRemoteController();
  final Map<String, WidgetBuilder> _routes = {
    "debug": (context) => DebugScreen(),
    // "profile": (context) => ProfileScreen(),
    // "feedback": (context) => FeedbackDialog(),
  };

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'FlutterModule',
      // navigatorObservers: [routeRemoteController],
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      routes: _routes,
      initialRoute: 'debug',
    );
  }
}

class DebugScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Debug Entry"),
        ),
        body: Builder(builder: _buildBody));
  }

  Widget _buildBody(BuildContext context) {
    return ListView(
      children: <Widget>[
        _NavigateItem(routeName: "profile"),
        _NavigateItem(routeName: "feedback"),
        _OptionItem(text: "Exit", onTap: () => Navigator.pop(context)),
      ],
    );
  }
}

class _OptionItem extends StatelessWidget {
  final VoidCallback onTap;
  final IconData icon;
  final String text;

  const _OptionItem({
    Key key,
    this.onTap,
    this.icon,
    @required this.text,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) => ListTile(
        leading: icon != null ? Icon(icon) : null,
        title: Text(text),
        onTap: onTap,
      );
}

class _NavigateItem extends StatelessWidget {
  final String routeName;
  final IconData icon;
  final String text;

  const _NavigateItem(
      {Key key, this.icon, String text, @required this.routeName})
      : this.text = text ?? routeName,
        super(key: key);

  @override
  Widget build(BuildContext context) => ListTile(
        leading: icon != null ? Icon(icon) : null,
        title: Text(text),
        onTap: () => Navigator.pushNamed(context, routeName),
      );
}

This is the android side code


object FlutterManager {
  private const val engineName = "default"
  private const val routeControlChannelName = "jora/navigation"

  private lateinit var flutterEngine: FlutterEngine

//  private val navigationControl: FlutterNavigationControl by lazy {
//    FlutterNavigationControl(
//      MethodChannel(flutterEngine.dartExecutor, routeControlChannelName, JSONMethodCodec.INSTANCE)
//    )
//  }

  fun init(context: Context) {
    flutterEngine = FlutterEngine(context)

    flutterEngine.dartExecutor.executeDartEntrypoint(
      DartExecutor.DartEntrypoint.createDefault()
    )

    FlutterEngineCache.getInstance().put(engineName, flutterEngine)
  }

  fun createFragment(routeName: String?): FlutterFragment {
//    routeName?.let {
//      navigationControl.replaceRoot(routeName)
//    }

    return FlutterFragment.withCachedEngine(engineName)
      .transparencyMode(TransparencyMode.transparent)
      .build()
  }

  fun startActivity(activity: Activity, routeName: String? = null) {
//    routeName?.let {
//      navigationControl.replaceRoot(routeName)
//    }

    activity.startActivity(
      CrossPlatformActivity
        .withCachedEngine(engineName)
        .backgroundMode(BackgroundMode.transparent)
        .build(activity.applicationContext)
    )
  }
}
//
//class FlutterNavigationControl(private val channel: MethodChannel) : MethodChannel.MethodCallHandler {
//  private val logger
//    get() = Timber.tag("FlutterNavigation")
//
//  init {
//    channel.setMethodCallHandler(this)
//  }
//
//  fun pushRoute(route: String) {
//    logger.i("Sending message to push route '$route'")
//    channel.invokeMethod("pushRoute", route)
//  }
//
//  fun popRoute() {
//    logger.i("Sending message to pop route.")
//    channel.invokeMethod("popRoute", null)
//  }
//
//  fun replaceRoot(route: String) {
//    logger.i("Sending message to replace root route: $route")
//    channel.invokeMethod("replaceRoot", route)
//  }
//
//  override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
//  }
//}
import io.flutter.embedding.android.FlutterActivity

class CrossPlatformActivity : FlutterActivity() {

  companion object {
    fun withCachedEngine(engineId: String): CachedEngineIntentBuilder =
      CachedEngineIntentBuilder(CrossPlatformActivity::class.java, engineId)
  }
}

Expected results:

When I pressed "Exit" button in flutter app, the last route is popped via Navigator.pop, the activity/fragment should be removed from the Android navigation stack, same as physical back button is pressed. I tried to host FlutterFragment in a activity or use FlutterActivity directly, both has the renders the transparent view.

Actual results: A transparent activity/fragment is still there, which can be dismissed by pressing physical back

Logs are attached below, expand it to see:

Logs ``` ``` ``` ⋊> flutter analyze Analyzing mobile-android... info • Unused import: 'package:flutter_module/screens/feedback/FeedbackDialog.dart' • flutter_module/lib/screens/app/FlutterApp.dart:5:8 • unused_import info • Unused import: 'package:flutter_module/screens/profile/ProfileScreen.dart' • flutter_module/lib/screens/app/FlutterApp.dart:6:8 • unused_import 2 issues found. (ran in 4.7s) ``` ``` [✓] Flutter (Channel stable, 1.22.2, on Mac OS X 10.15.5 19F101, locale en-AU) • Flutter version 1.22.2 at /Users/tim.wen/Workspace/flutter • Framework revision 84f3d28555 (3 weeks ago), 2020-10-15 16:26:19 -0700 • Engine revision b8752bbfff • Dart version 2.10.2 [✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3) • Android SDK at /Users/tim.wen/Library/Android/sdk • Platform android-29, build-tools 29.0.3 • ANDROID_HOME = Users/tim.wen/Library/Android/sdk • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593) • All Android licenses accepted. [✓] Xcode - develop for iOS and macOS (Xcode 12.1) • Xcode at /Applications/Xcode.app/Contents/Developer • Xcode 12.1, Build version 12A7403 • CocoaPods version 1.9.3 [!] Android Studio • Android Studio at /Applications/Android Studio 4.2 Preview.app/Contents ✗ Flutter plugin not installed; this adds Flutter specific functionality. ✗ Dart plugin not installed; this adds Dart specific functionality. • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593) [!] Android Studio (version 4.1) • Android Studio at /Applications/Android Studio.app/Contents ✗ Flutter plugin not installed; this adds Flutter specific functionality. ✗ Dart plugin not installed; this adds Dart specific functionality. • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593) [✓] VS Code (version 1.50.1) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.16.0 [✓] Connected device (1 available) • Android SDK built for x86 (mobile) • emulator-5554 • android-x86 • Android 10 (API 29) (emulator) ! Doctor found issues in 2 categories. ```
timnew commented 3 years ago

I'm not 100% this is a flutter bug or there is something critical missed from the code.

As I'm actually expecting to get a callback from Flutter Engine when all the routes has been popped from the root Navigator. So I can manually update the fragment stack.

I tried to use FlutterUiDisplayListener to capture the callback from Flutter, but FlutterUiDisplayListener.onFlutterUiNoLongerDisplayed was not called on all routes are popped, but called on FlutterActivity/FlutterFragment is closed.

timnew commented 3 years ago

Seems this is the similar issue as https://github.com/flutter/flutter/issues/67011 and https://github.com/flutter/flutter/issues/69879

TahaTesser commented 3 years ago

Hi @timnew Can you please provide a minimal complete reproducible code sample in a repository to better address the issue Thank you

timnew commented 3 years ago

@TahaTesser Yes I can, here is the repo: https://github.com/timnew/flutter-issue-69956

Steps to reproduce:

  1. Build and launch the Android app

  2. Press the Launch Flutter Activity button, flutter app will be launched

  3. Pressed the Exit button on flutter screen, to pop the main screen from navigator.

  4. A funny screen show appear image

  5. Press physical back would return to Android Activity

  6. Press Launch Flutter Activity button again, a blank screen would shown image

Same bug can be reproduced with FlutterFragment too, but to make it simpler, I uses FlutterActivity here

timnew commented 3 years ago

This issue can be somehow mitigated by checking whether current route is the last route in Navigator, if yes, calling SystemNavigator.pop instead of calling Navigator.pop.

But it still have issues:

  1. SystemNavigator.pop doesn't work for FlutterFragment, which actually finishes the hosting activity
  2. The behaviour of pop is different from the behaviour of pressing physical back
  3. It adds a lot of complexity on the Flutter navigation management.

So far, it is not a completely unsolvable issue, but it would be relatively complicated issue to address, if considering Flutter side might have nested navigator, and flutter app doesn't know whether the flutter is hosted in a activity or fragment.

It would be nice to have:

  1. SystemNavigator.pop() if called rather than pop the last route from the navigator, when Navigator.pop is invoked`
  2. SystemNavigator.pop calls a delegate on FlutterFragment, which can be registered on FlutterFragment when it is created, which can finish the host activity by default it not get overriden.
  3. So the hosting app can decide what is the best behaviour to unmount the FlutterUI.
TahaTesser commented 3 years ago
multiple flutter doctor -v ```bash [✓] Flutter (Channel stable, 1.22.3, on Microsoft Windows [Version 10.0.19042.610], locale en-US) • Flutter version 1.22.3 at C:\Code\flutter_stable • Framework revision 8874f21e79 (11 days ago), 2020-10-29 14:14:35 -0700 • Engine revision a1440ca392 • Dart version 2.10.3 [✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2) • Android SDK at C:\Code\sdk • Platform android-30, build-tools 30.0.2 • Java binary at: C:\Code\android-studio\jre\bin\java • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01) • All Android licenses accepted. [!] Android Studio (version 4.1.0) • Android Studio at C:\Code\android-studio ✗ Flutter plugin not installed; this adds Flutter specific functionality. ✗ Dart plugin not installed; this adds Dart specific functionality. • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01) [✓] VS Code (version 1.51.0) • VS Code at C:\Users\taha\AppData\Local\Programs\Microsoft VS Code • Flutter extension version 3.16.0 [!] Connected device ! No devices available ! Doctor found issues in 2 categories. ``` ```bash [✓] Flutter (Channel master, 1.24.0-8.0.pre.149, on Microsoft Windows [Version 10.0.19042.610], locale en-US) • Flutter version 1.24.0-8.0.pre.149 at C:\Code\flutter_master • Framework revision 8e7748e74c (7 hours ago), 2020-11-08 20:32:04 -0800 • Engine revision 0f7cdca65f • Dart version 2.12.0 (build 2.12.0-27.0.dev) [✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2) • Android SDK at C:\Code\sdk • Platform android-30, build-tools 30.0.2 • Java binary at: C:\Code\android-studio\jre\bin\java • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01) • All Android licenses accepted. [✓] Chrome - develop for the web • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe [✓] Visual Studio - develop for Windows (Visual Studio Community 2019 16.7.7) • Visual Studio at C:\Program Files (x86)\Microsoft Visual Studio\2019\Community • Visual Studio Community 2019 version 16.7.30621.155 • Windows 10 SDK version 10.0.18362.0 [✓] Android Studio (version 4.1.0) • Android Studio at C:\Code\android-studio • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01) [✓] VS Code (version 1.51.0) • VS Code at C:\Users\taha\AppData\Local\Programs\Microsoft VS Code • Flutter extension version 3.16.0 [✓] Connected device (4 available) • Windows (desktop) • windows • windows-x64 • Microsoft Windows [Version 10.0.19042.610] • Web Server (web) • web-server • web-javascript • Flutter Tools • Chrome (web) • chrome • web-javascript • Google Chrome 86.0.4240.183 • Edge (web) • edge • web-javascript • Microsoft Edge 86.0.622.63 • No issues found! ```
hamdikahloun commented 3 years ago

Maybe related to https://github.com/flutter/flutter/issues/67011

huycozy commented 1 year ago

This issue is reproducible on the latest Flutter channels but the current result has been changed a little bit:

On Reproduction Steps at https://github.com/flutter/flutter/issues/69956#issuecomment-723354500, it will show black screen instead of a funny screen as above. And then every time Launch Flutter Activity again, the black screen still persists. There is no exception log from the console.

Update the labels for further investigation.

Demo https://user-images.githubusercontent.com/104349824/207857725-dedb515c-fb48-43cd-8e8f-93bb44cee668.mp4
flutter doctor -v (stable and master) ```bash [✓] Flutter (Channel stable, 3.3.9, on macOS 13.0 22A380 darwin-x64, locale en-VN) • Flutter version 3.3.9 on channel stable at /Users/huynq/Documents/GitHub/flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision b8f7f1f986 (31 hours ago), 2022-11-23 06:43:51 +0900 • Engine revision 8f2221fbef • Dart version 2.18.5 • DevTools version 2.15.0 [✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0) • Android SDK at /Users/huynq/Library/Android/sdk • Platform android-33, build-tools 31.0.0 • ANDROID_HOME = /Users/huynq/Library/Android/sdk • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866) • All Android licenses accepted. [✓] Xcode - develop for iOS and macOS (Xcode 14.0.1) • Xcode at /Applications/Xcode.app/Contents/Developer • Build 14A400 • CocoaPods version 1.11.3 [✓] Chrome - develop for the web • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome [✓] Android Studio (version 2021.3) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866) [✓] IntelliJ IDEA Community Edition (version 2022.2.2) • IntelliJ at /Applications/IntelliJ IDEA CE.app • Flutter plugin version 70.0.5 • Dart plugin version 222.4167.21 [✓] IntelliJ IDEA Community Edition (version 2022.1.1) • IntelliJ at /Users/huynq/Library/Application Support/JetBrains/Toolbox/apps/IDEA-C/ch-0/221.5591.52/IntelliJ IDEA CE.app • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart [✓] VS Code (version 1.73.1) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.52.0 [✓] Connected device (3 available) • SM T225 (mobile) • R9JT3004VRJ • android-arm64 • Android 12 (API 31) • macOS (desktop) • macos • darwin-x64 • macOS 13.0 22A380 darwin-x64 • Chrome (web) • chrome • web-javascript • Google Chrome 107.0.5304.110 [✓] HTTP Host Availability • All required HTTP hosts are available • No issues found! ``` ```bash [!] Flutter (Channel master, 3.7.0-9.0.pre.11, on macOS 13.0.1 22A400 darwin-x64, locale en-VN) • Flutter version 3.7.0-9.0.pre.11 on channel master at /Users/huynq/Documents/GitHub/flutter_master ! Warning: `flutter` on your path resolves to /Users/huynq/Documents/GitHub/flutter/bin/flutter, which is not inside your current Flutter SDK checkout at /Users/huynq/Documents/GitHub/flutter_master. Consider adding /Users/huynq/Documents/GitHub/flutter_master/bin to the front of your path. ! Warning: `dart` on your path resolves to /Users/huynq/Documents/GitHub/flutter/bin/dart, which is not inside your current Flutter SDK checkout at /Users/huynq/Documents/GitHub/flutter_master. Consider adding /Users/huynq/Documents/GitHub/flutter_master/bin to the front of your path. • Upstream repository https://github.com/flutter/flutter.git • Framework revision dbc9306380 (4 hours ago), 2022-12-14 13:53:20 -0800 • Engine revision 0a6a4a58f4 • Dart version 3.0.0 (build 3.0.0-21.0.dev) • DevTools version 2.20.0 • If those were intentional, you can disregard the above warnings; however it is recommended to use "git" directly to perform update checks and upgrades. [✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0) • Android SDK at /Users/huynq/Library/Android/sdk • Platform android-33, build-tools 31.0.0 • ANDROID_HOME = /Users/huynq/Library/Android/sdk • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866) • All Android licenses accepted. [✓] Xcode - develop for iOS and macOS (Xcode 14.1) • Xcode at /Applications/Xcode.app/Contents/Developer • Build 14B47b • CocoaPods version 1.11.3 [✓] Chrome - develop for the web • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome [✓] Android Studio (version 2021.3) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866) [✓] IntelliJ IDEA Community Edition (version 2022.1.1) • IntelliJ at /Users/huynq/Library/Application Support/JetBrains/Toolbox/apps/IDEA-C/ch-0/221.5591.52/IntelliJ IDEA CE.app • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart [✓] VS Code (version 1.73.1) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.54.0 [✓] Connected device (4 available) • SM T225 (mobile) • R9JT3004VRJ • android-arm64 • Android 12 (API 31) • iPhone (mobile) • d9a94afe2b649fef56ba0bfeb052f0f2a7dae95e • ios • iOS 15.7.2 19H218 • macOS (desktop) • macos • darwin-x64 • macOS 13.0.1 22A400 darwin-x64 • Chrome (web) • chrome • web-javascript • Google Chrome 108.0.5359.98 ! Error: iPhone is busy: Fetching debug symbols for iPhone. Xcode will continue when iPhone is finished. (code -10) [✓] HTTP Host Availability • All required HTTP hosts are available ! Doctor found issues in 1 category. ```