Bundle.main.resourcePath 在我的 flutter 插件中返回 nil,之前工作正常
Bundle.main.resourcePath returning nil in my flutter plugin, after working fine previously
我制作了一个测试 flutter 应用程序,它使用我制作的插件,该插件仅检索我的 .app 中资源文件夹的路径,并将其 returns 到我的 dart 代码。
这在使用插件生成的示例项目中工作得很好,并且以前与我的应用程序一起工作过。在此之后我有一段时间没有使用该插件并且它一直未被使用,直到最近因为我现在实际使用它所以再次将它包含在我的代码中。现在这个插件似乎不适用于我添加它的任何项目,即使是新制作的项目。
我的插件由以下飞镖代码组成:
import 'dart:async';
import 'package:flutter/services.dart';
class MacBundleUtils {
static const MethodChannel _channel =
const MethodChannel('mac_bundle_utils');
static Future<String?> get getResourcesDir async {
final String? resDir = await _channel.invokeMethod('getResourcesDir');
return resDir;
}
}
和这个 swift 代码:
import Cocoa
import FlutterMacOS
public class MacBundleUtilsPlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "mac_bundle_utils", binaryMessenger: registrar.messenger)
let instance = MacBundleUtilsPlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "getResourcesDir":
result(Bundle.main.resourcePath)
default:
result(FlutterMethodNotImplemented)
}
}
}
然后我尝试检索此路径并使用这一行将其打印到控制台:
print(await MacBundleUtils.getResourcesDir);
然而returns出现以下错误:
Unhandled Exception: Null check operator used on a null value
我这里哪里做错了?
谢谢。
实际上,我在发布这个问题后不久就找到了解决方案。
我试图过早地访问 Bundle.main,因为我的代码在 void main() 中。
在使用 initState() 加载后移动我的代码以执行后,如下所示:
@override
void initState() { //for linux app, tells user if permissions aren't correct
super.initState();
WidgetsBinding.instance!.addPostFrameCallback((_) async {
print(await MacBundleUtils.getResourcesDir);
});
}
它没有问题。
我制作了一个测试 flutter 应用程序,它使用我制作的插件,该插件仅检索我的 .app 中资源文件夹的路径,并将其 returns 到我的 dart 代码。
这在使用插件生成的示例项目中工作得很好,并且以前与我的应用程序一起工作过。在此之后我有一段时间没有使用该插件并且它一直未被使用,直到最近因为我现在实际使用它所以再次将它包含在我的代码中。现在这个插件似乎不适用于我添加它的任何项目,即使是新制作的项目。
我的插件由以下飞镖代码组成:
import 'dart:async';
import 'package:flutter/services.dart';
class MacBundleUtils {
static const MethodChannel _channel =
const MethodChannel('mac_bundle_utils');
static Future<String?> get getResourcesDir async {
final String? resDir = await _channel.invokeMethod('getResourcesDir');
return resDir;
}
}
和这个 swift 代码:
import Cocoa
import FlutterMacOS
public class MacBundleUtilsPlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "mac_bundle_utils", binaryMessenger: registrar.messenger)
let instance = MacBundleUtilsPlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "getResourcesDir":
result(Bundle.main.resourcePath)
default:
result(FlutterMethodNotImplemented)
}
}
}
然后我尝试检索此路径并使用这一行将其打印到控制台:
print(await MacBundleUtils.getResourcesDir);
然而returns出现以下错误:
Unhandled Exception: Null check operator used on a null value
我这里哪里做错了?
谢谢。
实际上,我在发布这个问题后不久就找到了解决方案。 我试图过早地访问 Bundle.main,因为我的代码在 void main() 中。 在使用 initState() 加载后移动我的代码以执行后,如下所示:
@override
void initState() { //for linux app, tells user if permissions aren't correct
super.initState();
WidgetsBinding.instance!.addPostFrameCallback((_) async {
print(await MacBundleUtils.getResourcesDir);
});
}
它没有问题。