如果使用 Android 后台服务,Flutter 会停留在“等待天文台端口可用”

Car*_*ein 11 java android dart flutter

我一直在尝试为 Flutter 编写平台代码以启动后台服务。在这里,我使用了一个没有完成实际工作的最小示例来表明应用程序根本无法运行。实际的颤振代码根本没有被修改。

主活动.java

public class MainActivity extends FlutterActivity {

  Intent i = new Intent(this, MainService.class);

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
  }
}
Run Code Online (Sandbox Code Playgroud)

主服务.java

public class MainService extends IntentService {
  public MainService() {
    super("MainService");
  }

  @Override
  protected void onHandleIntent(Intent Intent) {
  }
}
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml

 <service android:enabled="true"
android:name=".MainService"></service>
Run Code Online (Sandbox Code Playgroud)

buildVersion > 27 并且 Manifest 文件相应地service添加了标签。

编译并运行 withflutter run -v将显示以下消息:

..
[ +121 ms] Starting: Intent { act=android.intent.action.RUN flg=0x20000000 cmp=com.example.hello/.MainActivity (has extras)}
[   +1 ms] Waiting for observatory port to be available...
Run Code Online (Sandbox Code Playgroud)

并且安装卡住了。

有解决方法吗?如果这是 Flutter 实现中的实际错误,是否也意味着无法在后台运行 Flutter 应用程序?

Dav*_*isk 5

我遇到了这个问题,并最终将其归结为我将项目的包名称更改为 com.test 的事实。AndroidManifest 中的MyAppName。这不是有效的 Dart 包名称。您可以通过尝试使用创建新项目来验证这一点

flutter create --org com.test MyAppName

这会导致错误消息:

“MyAppName”不是有效的 Dart 包名称。

Pubspec 格式描述

DO使用lowercase_with_underscores的包名。

包名应该全部小写,用下划线分隔单词,just_like_this. 仅使用基本的拉丁字母和阿拉伯数字:[a-z0-9_]。另外,请确保名称是有效的 Dart 标识符——它不以数字开头并且不是保留字。

我的解决方案是通过运行重新创建具有所需值的项目

flutter create --org com.test my_app_name

并复制 lib 文件夹、pubspec 文件、任何资产等。这应该可以解决问题。请注意,这会导致 kotlin 文件夹 (android/app/main/kotlin) 根据您指定的域正确设置子文件夹,例如 kotlin/com/test/ 用于 com.test


小智 4

我有同样的问题。就我而言,flutter clean解决了这个问题。对我来说问题的原因是 Android 包中的重命名。重命名包后,您可能需要清理 flutter 旧的构建文件。