Flutter - 仅在添加到现有应用程序时启动时缺少插件

Posted

技术标签:

【中文标题】Flutter - 仅在添加到现有应用程序时启动时缺少插件【英文标题】:Flutter - Missing Plugin on startup only when adding to existing app 【发布时间】:2021-03-17 17:33:39 【问题描述】:

我们有一个现有的 ios 应用程序,正在尝试移植到 Flutter。我已按照文档中列出的步骤进行操作,一切进展顺利。但是,我遇到了可怕的事情:

[VERBOSE-2:ui_dart_state.cc(177)] 未处理的异常: MissingPluginException(未找到方法读取的实现 通道 plugins.it_nomads.com/flutter_secure_storage) #0 MethodChannel._invokeMethod

我花了几天时间尝试了所有常见的事情:

    删除应用并重新安装 删除 .flutter-plugins-dependencies 和 .flutter-plugins 然后重新获取 pub 在 xCode 中清理构建目录 1100 亿次重建 ios-framework 喝很多啤酒,像水手的鹦鹉一样发誓

一切都没有奏效。这让我觉得有些不对劲,所以我重构了代码。如果我尝试在 main.dart 之外使用 Flutter 的安全存储,它会神奇地起作用!没问题!然后我认为问题可能是secure_storage,所以我决定使用main.dart中的连接包,而不是像我们以后使用它并达到完全相同的错误(唯一的区别是抛出 MissingPluginException 的包名称)。然后我尝试创建一个独立的纯颤振程序,如果我像我一样在 main.dart 中使用这些包,它就可以工作。但是,它在这里失败了,而且失败得很惨。我认为理想情况下它应该在 main.dart 中,因为我们需要根据安全存储中的实际内容来确定是否显示入职屏幕或登录屏幕。如果有帮助,下面是我的飞镖代码。就像我说的那样,如果我把它去掉并使用连接性,它也会失败。它只会在我的 ios 框架内失败,因为我将此代码放在一个已经存在的应用程序中。

如果您在 main.dart 中为像我尝试做的非 Flutter 应用程序运行包,是否需要做一些事情来初始化包? 如果我希望在 Flutter 生命周期的早期从 FlutterViewController 调用这些包,我是否遗漏了什么?我正在从我的 AppDelegate#didFinishLaunchingWithOptions 调用flutterViewController,所以它还为时过早。我们希望所有 UI 代码都在颤动。我这样称呼它:
  flutterEngine.run()
  let flutterViewController =
           FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil)
  self.window?.rootViewController = flutterViewController
  self.window?.makeKeyAndVisible()

代码:

bool hasSeenOnboarding = false;
String railsKey;
final tripsProvider = ChangeNotifierProvider<TripsProvider>(
  (ref) => TripsProvider(ref.read),
);

void main() async 
  WidgetsFlutterBinding.ensureInitialized();
  hasSeenOnboarding = await SecureStorageLtr.hasSeenIntroScreens();
  railsKey = await SecureStorageLtr.getToken();
  runApp(ProviderScope(child: MyApp()));


class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return CupertinoApp(
      debugShowCheckedModeBanner: false,
      localizationsDelegates: [
        DefaultMaterialLocalizations.delegate,
        DefaultCupertinoLocalizations.delegate,
        DefaultWidgetsLocalizations.delegate,
      ],
      title: 'My Title',
      home: hasSeenOnboarding
          ? railsKey == null
              ? InitialLoginScreen()
              : TabBarLtr()
          : OnboardingScreen(),
      onGenerateRoute: RouteGenerator.generateRoute,
    );
  

【问题讨论】:

【参考方案1】:

所以显然问题是一个简单的问题,但却是一个很大的痛苦。如果这么早使用它们,您需要注册您的插件。我无法从 Flutter 找到有关官方文档的任何信息,但能够在一些随机的博客文章中在线找到它。完成这一行之后,它现在神奇地适用于这么早的任何和所有包!快乐编码!

新的 swift 代码:

import FlutterPluginRegistrant

...

  flutterEngine.run()
  GeneratedPluginRegistrant.register(with: self.flutterEngine) //THIS is new line
  let flutterViewController =
           FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil)
  self.window?.rootViewController = flutterViewController
  self.window?.makeKeyAndVisible()

【讨论】:

天哪!你拯救了我的一天!

以上是关于Flutter - 仅在添加到现有应用程序时启动时缺少插件的主要内容,如果未能解决你的问题,请参考以下文章

颤振 |如何将数据添加到 Firestore 中的现有文档

仅在 Flutter 的调试模式下运行的应用程序

将Flutter添加到现有应用——过程中遇到的问题

Flutter - 添加启动器图标时出错 - 依赖项可能只有一个来源

添加新元素时,角度更新现有 FormArray 元素的有效性

ComboBox仅在重新启动时更新,Java