首页 > 解决方案 > 如何在颤振中导入平台特定文件?

问题描述

我正在使用JS 包进行Flutter to JS通信,反之亦然。当我尝试在网络上运行时它工作正常,但在尝试在移动模拟器中运行时出现错误。

我正在尝试这个

import 'package:flutter/material.dart'
if(dart.library.jqyery) 'common.dart';

但这开始对文件中的所有功能产生错误common. dart

这是common. dart

@JS()
library jquery;

import 'globals.dart';
import 'package:js/js.dart';

@JS('myCallDartToJSFunction')
external void myAlert(String str);

@JS('connectToSignalR')
external void connectToSignalR();

@JS("mySendMsgTSignalR")
external void myDartSendMsgTSignalR(String nam, String msg);

@JS('myCallJSToDart')
external set _myCallJSToDart(void Function(String str, int x) f);

@JS()
external void myCallJSToDart(String str, int x);

void _someDartFunction(String str, int x) {
  print(str + x.toString());
  msgFromSignalr = str;
}

@JS('messageFromSignalR')
external set _messageFromSignalR(void Function(String str) f);

@JS()
external void messageFromSignalR();

String _dartmessageFromSignalR(String str) {

}

void bindmain() {
  _myCallJSToDart = allowInterop((text, x) => _someDartFunction(text, x));
  _messageFromSignalR = allowInterop((str) => _dartmessageFromSignalR(str));
}

标签: javascriptflutterdart

解决方案


在您的示例中flutter/material.dart,您是在移动设备上导入的,这不会被接受为common.dart. 在进行条件导入时,您应该始终提供 2 个相同的实现。例如,在您的情况下,这意味着创建一个文件,该文件common_mobile.dart将实现与您相同的方法,common.dart但什么也不做(甚至抛出 UnimplementedException),因为在您使用移动设备时不应调用它们。

我看到您正在内部创建一个库common.dart,如果您想同时保留移动设备和 Web 实现,则不建议这样做,因为您将拥有 2 个同名的库。

应按如下方式进行条件导入:

import 'common_mobile.dart'
   if (dart.library.js) 'common.dart' as commonUtils;

在此示例中,我默认导入文件common_mobile.dart,但如果我使用的是网络版本(可以使用 验证if (dart.library.js)),我正在导入common.dart. 我正在添加as commonUtils关键字以保护我对导入的调用。

现在以拨打电话myAlert为例:

/// Making a web verification to ensure your call is only done when running on web.
if (kIsWeb) {
   /// It should call the myAlert implementation from common.dart
   commonUtils.myAlert('Test');
}

此外,我看到您的包不支持移动设备,这意味着如果存在与您的包直接相关的构建错误,无论您做什么,您都无法在移动设备上构建,您唯一的选择是将您的项目分成 2分支(一个仅限移动设备,另一个仅限 Web)以删除仅支持特定平台的软件包。


推荐阅读