首页 > 解决方案 > Bundle.main.resourcePath 在我的颤振插件中返回 nil,之前工作正常

问题描述

我制作了一个测试颤振应用程序,该应用程序使用我制作的插件,该插件仅检索我的 .app 中资源文件夹的路径并将其返回到我的飞镖代码。

这在使用插件生成的示例项目中完全可以正常工作,并且之前已与我的应用程序一起使用。在此之后我有一段时间没有使用该插件并且它一直没有使用,直到最近因为我现在实际使用它所以再次将它包含在我的代码中。现在该插件似乎不适用于我添加到的任何项目,即使是新制作的项目。

我的插件包含这个飞镖代码:

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;
  }
}

这个快速代码:

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);

但是,这会返回以下错误:

Unhandled Exception: Null check operator used on a null value

我在这里做错了什么?

谢谢。

标签: swiftflutterflutter-plugin.app

解决方案


实际上,我在发布此问题后不久就遇到了解决方案。我试图过早访问 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);
  });
}

它没有问题。


推荐阅读