我正在尝试在 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
我创建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)?
我有以下问题:现在 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
假设在 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
将 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 平台通道 - 我可以从任何端调用任何代码
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) 使用 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) 我想在我的 flutter 项目中添加原生 android 库,我正在尝试执行平台通道,但 Flutter Activity 没有导入到我的 android 代码中,我发现这可能是因为这个,因为这显示为一个问题,我已尝试更新flutter插件,重新启动ide,但没有任何效果。我该怎么做才能导入 android 版的 flutter? Flutter Activity 未导入, 谢谢。
android flutter flutter-dependencies flutter-platform-channel
将 Firebase 消息传递到应用程序后,热重载和重新启动在 Android 上不起作用。
出现此错误:
热重载错误
reloadSources: (105) 隔离必须可运行
在发出此请求之前隔离必须可运行
在 iOS 上,它们运行良好。
我编写了一个 Flutter 插件来使用需要包含一些 .aar 模块的 SDK。它在插件的示例应用程序中构建并完美运行,但是当我在不同的应用程序中导入插件并尝试构建它时,构建立即失败并显示一条消息,指出在插入。这是没有意义的,因为模块肯定存在 - 如果模块不存在,则在示例应用程序中使用 SDK 的平台通道将失败。
为什么示例应用程序可以毫无问题地构建和运行,而不同的应用程序却不能?我唯一能想到的是我从 pubspec 中的路径导入插件,但在我看来这不太可能是罪魁祸首。
任何建议或帮助在这里将不胜感激。蒂亚!