标签: flutter-platform-channel

Flutter 项目:缺少 MainActivity.java

我正在尝试在 Flutter 项目中创建一个平台通道来访问特定于 Android 的 java 代码。我正在 Android Studio 中创建一个新的 Flutter 应用程序项目,并遵循教程,其中提到:

1- 导航到 Flutter 应用所在的目录,然后选择其中的 android 文件夹。单击确定。

2- 打开位于项目视图中 java 文件夹中的 MainActivity.java 文件。

但是,该项目仅包含 MainActivity.kt 而不是 Java:

在此处输入图片说明

我尝试使用上下文菜单>新建>活动在java文件夹中手动创建一个新活动,但它不起作用。


编辑:

对此的最佳解决方案(如果您可以创建新项目)是在设置项目时取消选中“Include Kotlin support for Android code”。这会自动创建 MainActivity.java。Objective-C 和 Swift 也是如此。如果您想使用 Objective-C,请取消选中“Include Swift support for iOS code”

在此处输入图片说明

java android android-studio flutter flutter-platform-channel

10
推荐指数
4
解决办法
1万
查看次数

在flutter插件中获取活动参考

我创建flutter插件的时候,插件类中默认有两个方法:

override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding)
Run Code Online (Sandbox Code Playgroud)

fun registerWith(registrar: Registrar)
Run Code Online (Sandbox Code Playgroud)

对文件的评论说: It is encouraged to share logic between onAttachedToEngine and registerWith to keep them functionally equivalent. Only one of onAttachedToEngine or registerWith will be called depending on the user's project. onAttachedToEngine or registerWith must both be defined in the same class.

现在,我需要从这里开始另一项活动,使用activity.startActivityForResult(). 可以在registerWith(registrar: Registrar)使用中获得对活动的引用registrar.activity()。我怎样才能在方法中做到这一点onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding)

flutter flutter-plugin flutter-platform-channel

10
推荐指数
2
解决办法
4174
查看次数

读取 Flutter 应用程序中先前存储在本机应用程序中的共享首选项

我有以下问题:现在 PlayStore 中有一个应用程序是用本机代码(iOS 和 Android)编写的,我正计划迁移到 Flutter。我的目标是用户不会注意到引擎盖下的变化,但可以像以前一样继续使用该应用程序。为此,我还需要迁移共享首选项。然而,这是相当困难的。在原生 Android 应用程序中,我像这样存储了相关的共享首选项:

SharedPreferences sharedPrefs = context.getSharedPreferences(
    "storage",
    Context.MODE_PRIVATE
);

sharedPrefs.putString('guuid', 'guuid_value');
editor.apply();
Run Code Online (Sandbox Code Playgroud)

这会导致在此路径上创建一个文件:

/data/data/patavinus.patavinus/shared_prefs/storage.xml
Run Code Online (Sandbox Code Playgroud)

有了这个内容:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <int name="guuid" value="guuid_value" />
</map>
Run Code Online (Sandbox Code Playgroud)

如果我在 Flutter 中使用 shared_prefences 通过这样做来获取这个值:

final sharedPreferences = await SharedPreferences.getInstance();
sharedPreferences.getString('guuid');
Run Code Online (Sandbox Code Playgroud)

它返回 null 因为它寻找

/data/data/patavinus.patavinus/shared_prefs/FlutterSharedPreferences.xml这是在 Flutter 中使用 shared_preferences 存储共享首选项时写入的文件。因为共享首选项是在本机应用程序上下文中编写的,该文件显然不存在。

有没有什么方法可以让 Flutter 去寻找/data/data/patavinus.patavinus/shared_prefs/storage.xml而不必使用平台通道?

我知道这是如何工作的,就像这里提到的那样:How to access flutter Shared preference on the android end (using java)。这种方式很简单,因为在 Android 中你可以选择在 Flutter 的前缀前面加上。但是,在 Flutter 中你不能。

我也知道这个插件:https : …

migration sharedpreferences flutter flutter-platform-channel

7
推荐指数
2
解决办法
2118
查看次数

Flutter中FlutterError.onError和PlatformDispatcher.instance.onError的区别

假设在 Flutter 应用程序中,我们希望在顶层捕获任何未捕获的异常/错误,因此我们按照文档执行此操作:

main() {
  
  // All uncaught errors thrown from synchronous code blocks will end up here:
  FlutterError.onError = (FlutterErrorDetails details) {
    MyLogger.instance.logUncaughtErrorSync(details);
  };

  // All uncaught errors thrown from async code blocks will end up here:
  PlatformDispatcher.instance.onError = (Object error, StackTrace stack) {
    MyLogger.instance.logUncaughtErrorASync(error, stack);
    return true;
  };
  
  runApp(const MyApp());
Run Code Online (Sandbox Code Playgroud)

虽然文档似乎暗示两者之间的区别在于错误是否源自 Dart(特别是“Flutter”)代码与平台(Android/IOS)代码,但通过我的测试,我可以看出两者之间的唯一区别是对象(错误)是否是从异步或同步 Dart 代码中抛出的。

例如,如果在Dart代码(不是平台代码)中,我们只需输入:

_function() async {
    throw('error');
}
Run Code Online (Sandbox Code Playgroud)

我们称之为该函数,它将通过“平台调度程序”冒泡并被视为“平台错误”,但似乎只是因为它发生在后台线程上?

实际上似乎没有任何机制允许从 Java 或 Swift 代码抛出异常来触发这些 onError 函数。

但肯定不止于此,那么拥有两种独立的机制(具有不同的输入——FlutterErrorDetails 与 Object+StackTrace)有什么意义……真正的区别是什么?

error-handling dart dart-async flutter flutter-platform-channel

7
推荐指数
1
解决办法
2145
查看次数

将 Flutter 集成到本机主机应用程序时,从 Flutter 完成 FlutterActivity [Add2App]

将 Flutter 集成到主机应用程序 ( docs ) 时,有几种方法可以做到,其中一种(最简单的)是通过FlutterActivity类在新 Activity 中打开 Flutter 。像这样:

// Java
hostActivity.startActivity(                
  FlutterActivity.withCachedEngine("my_engine_id").build(context)
);
Run Code Online (Sandbox Code Playgroud)

传统上,对于 Flutter 端的 Android 样式窗口,我们创建带有后退按钮的AppBar 。

此 AppBar后退按钮和 Android 系统后退按钮的行为必须相同:按下后退按钮时必须关闭(完成)前台活动。

当前系统后退按钮确实关闭了FlutterActivity,但是如何从 Flutters AppBar后退按钮模拟这种行为?

// Dart - Flutter side
...
child: AppBar(
  leading: IconButton(
      icon: Icon(Icons.arrow_back),
      onPressed: () {
          // WHAT MUST BE HERE?
      }),
...
Run Code Online (Sandbox Code Playgroud)

建立 Flutter 端和主机之间的 PS 平台通道 - 我可以从任何端调用任何代码

android flutter flutter-appbar flutter-platform-channel

6
推荐指数
1
解决办法
685
查看次数

在 Flutter AndroidView 中点击时 EditText 不显示键盘

import android.content.Context;\nimport android.view.View;\nimport android.widget.EditText;\nimport io.flutter.plugin.common.MethodCall; \nimport io.flutter.plugin.common.MethodChannel;\nimport static io.flutter.plugin.common.MethodChannel.Result;\nimport io.flutter.plugin.common.BinaryMessenger;\nimport io.flutter.plugin.platform.PlatformView;\n\npublic class FlutterTextView implements PlatformView, MethodChannel.MethodCallHandler {\n    private final EditText textView;\n    private final MethodChannel methodChannel;\n\n    FlutterTextView(Context context, BinaryMessenger messenger, int id) {\n        textView = new EditText(context);\n        methodChannel = new MethodChannel(messenger, "plugins.cjs.test/textview_" + id);\n        methodChannel.setMethodCallHandler(this);\n    }\n\n    @Override\n    public View getView() {\n        return textView;\n    }\n\n    @Override\n    public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {\n        switch (methodCall.method) {\n            case "setText":\n                setText(methodCall, result);\n                break;\n            default:\n                result.notImplemented();\n        }\n\n    }\n\n    private void setText(MethodCall methodCall, Result result) {\n …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-plugin flutter-platform-channel

5
推荐指数
0
解决办法
727
查看次数

Flutter:如何等待android平台通道函数完成并返回结果

使用 AWS SDK 在 Android 上创建用于文件上传的平台通道。现在我想在后台等待上传完成并返回结果的状态。

MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "uploadToAWS") {
                new DoUpload().execute();

                // how to await here ?
                result.success(true);
            } else {
                result.notImplemented()
            }
        }
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-platform-channel

5
推荐指数
1
解决办法
3318
查看次数

依赖项列表中的无效项目“Flutter for Android”

我想在我的 flutter 项目中添加原生 android 库,我正在尝试执行平台通道,但 Flutter Activity 没有导入到我的 android 代码中,我发现这可能是因为这个,因为这显示为一个问题,我已尝试更新flutter插件,重新启动ide,但没有任何效果。我该怎么做才能导入 android 版的 flutter? Flutter Activity 未导入, 谢谢。

android flutter flutter-dependencies flutter-platform-channel

5
推荐指数
1
解决办法
5980
查看次数

Flutter:添加 Firebase 后台功能后,热重载和热重启在 Android 上不起作用

将 Firebase 消息传递到应用程序后,热重载和重新启动在 Android 上不起作用。

出现此错误:

热重载错误

reloadSources: (105) 隔离必须可运行

在发出此请求之前隔离必须可运行

在 iOS 上,它们运行良好。

flutter flutter-platform-channel

5
推荐指数
1
解决办法
1384
查看次数

使用 .aar 模块的 Flutter 插件在示例应用程序中构建和运行良好,但无法在其他应用程序中构建

我编写了一个 Flutter 插件来使用需要包含一些 .aar 模块的 SDK。它在插件的示例应用程序中构建并完美运行,但是当我在不同的应用程序中导入插件并尝试构建它时,构建立即失败并显示一条消息,指出在插入。这是没有意义的,因为模块肯定存在 - 如果模块不存在,则在示例应用程序中使用 SDK 的平台通道将失败。

为什么示例应用程序可以毫无问题地构建和运行,而不同的应用程序却不能?我唯一能想到的是我从 pubspec 中的路径导入插件,但在我看来这不太可能是罪魁祸首。

任何建议或帮助在这里将不胜感激。蒂亚!

flutter flutter-plugin flutter-platform-channel

4
推荐指数
1
解决办法
688
查看次数