Flutter Node.js互操作插件node_interop的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter Node.js互操作插件node_interop的使用

简介

node_interop 是一个允许你在Dart中编写应用程序并在NodeJS环境中运行的库。它提供了与核心Node API和内置模块交互的JavaScript绑定和一些实用工具。

Build Status Pub Gitter

关键链接

使用示例

示例1:简单的Hello World应用

import 'package:node_interop/node.dart';

void main() {
  print("Hello world, I'm currently in ${process.cwd()}.");
}

这个应用可以通过build_node_compilers编译并在Node环境中执行。

示例2:读取当前工作目录并打印JSON格式内容

// Copyright (c) 2018, Anatoly Pulyaevskiy. All rights reserved. Use of this source code
// is governed by a BSD-style license that can be found in the LICENSE file.

import 'dart:convert';
import 'package:node_interop/fs.dart';
import 'package:node_interop/node.dart';

/// Simple example of reading contents of current working directory and
/// printing out as nicely indented JSON.
void main() {
  final contents = List<String>.from(fs.readdirSync(process.cwd()));
  final json = JsonEncoder.withIndent('  ');
  print(json.convert(contents));
}

示例3:创建自定义可写流

import 'dart:js_util'; // provides callConstructor()
import 'package:node_interop/stream.dart';

Writable createWritable(WritableOptions options) {
  return callConstructor(stream.Writable, [options]);
}

void main() {
  var writable = createWritable({'objectMode': true});
  writable.on('finish', () => print('All writes are now complete.'));
  writable.write('some data');
  writable.end();
}

库结构

每个内置的Node模块在lib/文件夹中都有一个对应的Dart文件。例如,要访问Node的os模块,可以使用以下导入:

import 'package:node_interop/os.dart';

导入后不需要再通过require来引入模块。每个库文件(如os.dart)暴露了一个同名的库级属性,可以直接使用该模块的功能。

对于带有下划线的库(如child_process),库级属性会将下划线转换为驼峰命名法以符合Dart代码风格规则:

import 'package:node_interop/child_process.dart';

void main() {
  childProcess.execSync('ls -la');
}

注意事项

由于大多数Node.js对象不是全局对象,因此它们在库中被声明为@anonymous,这使得无法直接使用new Something()来实例化新对象。作为替代方案,每个模块提供了一个createX()库函数来创建自定义对象。

例如,stream模块提供了createReadablecreateWritable来创建自定义的ReadableWritable流:

import 'dart:js_util'; // provides callConstructor()

/// The "stream" module's object as returned from [require] call.
StreamModule get stream => _stream ??= require('stream');
StreamModule _stream;

@JS()
@anonymous
abstract class StreamModule {
  /// Reference to constructor function of [Writable].
  dynamic get Writable;

  /// Reference to constructor function of [Readable].
  dynamic get Readable;
}

/// Creates custom [Writable] stream with provided [options].
///
/// This is the same as `callConstructor(stream.Writable, [options]);`.
Writable createWritable(WritableOptions options) {
  return callConstructor(stream.Writable, [options]);
}

状态

版本1.0.0被认为是稳定的,但尚未完全实现所有功能。建议检查1.0.0-dev.*版本以获取最新的更新和bug修复。每次发布后,请查看CHANGELOG.md以了解所有重要的更改和升级说明。

支持的Node.js模块

以下是已经提供绑定的内置Node.js模块列表:

  • ✅ buffer
  • ✅ child_process
  • ❌ cluster
  • ✅ console
  • ✅ dns
  • ❌ domain
  • ✅ events
  • ✅ fs
  • ✅ http
  • ✅ https
  • ✅ module
  • ✅ net
  • ✅ os
  • ✅ path
  • ✅ process
  • ✅ querystring
  • ❌ readline
  • ✅ stream
  • ❌ string_decoder
  • ✅ timers
  • ✅ tls
  • ❌ tty
  • ❌ dgram
  • ❌ url
  • ❌ util
  • ❌ v8
  • ❌ vm
  • ❌ zlib

如果发现任何问题或有新的需求,请在issue tracker中提交。

希望这些信息能帮助你更好地理解和使用node_interop插件!


更多关于Flutter Node.js互操作插件node_interop的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Node.js互操作插件node_interop的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,通过node_interop插件,可以实现与Node.js的互操作,从而让你在Flutter应用中调用Node.js的功能。以下是一个简单的示例,展示如何在Flutter中使用node_interop插件来调用Node.js的代码。

首先,确保你的开发环境已经设置好,包括Flutter和Node.js。然后,按照以下步骤操作:

  1. 添加依赖: 在你的pubspec.yaml文件中添加node_interop依赖:

    dependencies:
      flutter:
        sdk: flutter
      node_interop: ^x.y.z  # 请替换为最新版本号
    

    然后运行flutter pub get来安装依赖。

  2. 配置Flutter项目: 由于node_interop主要用于Flutter的桌面端(如Windows, macOS, Linux),确保你的Flutter项目已经配置为支持桌面端开发。你可以使用flutter config --enable-windows-desktopflutter config --enable-macos-desktopflutter config --enable-linux-desktop命令来启用相应的桌面端支持。

  3. 创建Node.js脚本: 创建一个简单的Node.js脚本,例如script.js,内容如下:

    module.exports = {
      hello: function(name) {
        return `Hello, ${name}!`;
      }
    };
    
  4. 在Flutter中调用Node.js脚本: 使用node_interop在Flutter中调用上述Node.js脚本。以下是一个示例代码:

    import 'dart:io';
    import 'package:flutter/material.dart';
    import 'package:node_interop/node.dart' as node;
    import 'package:node_interop/node_interop.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Flutter Node.js Interop'),
            ),
            body: Center(
              child: FutureBuilder<String>(
                future: callNodeScript(),
                builder: (context, snapshot) {
                  if (snapshot.connectionState == ConnectionState.done) {
                    if (snapshot.hasError) {
                      return Text('Error: ${snapshot.error}');
                    } else {
                      return Text('Result: ${snapshot.data}');
                    }
                  } else {
                    return CircularProgressIndicator();
                  }
                },
              ),
            ),
          ),
        );
      }
    }
    
    Future<String> callNodeScript() async {
      // 确保你的Node.js脚本路径正确
      var scriptPath = 'path/to/your/script.js'; // 替换为你的script.js实际路径
    
      // 使用Node.js执行脚本并获取结果
      var result = await node.require(scriptPath).hello('Flutter');
    
      // 由于node_interop返回的是JavaScript对象,需要转换为Dart字符串
      return result.toString();
    }
    

    注意:上述代码中的callNodeScript函数是一个简化的示例,实际上node_interop与Node.js的交互可能涉及更多复杂的上下文管理和类型转换。此外,node.require的调用方式可能需要根据实际情况调整,特别是在不同的平台和环境配置下。

  5. 运行Flutter应用: 确保你的Flutter应用运行在支持Node.js的环境中(如桌面端),然后运行应用。你应该能够看到从Node.js脚本返回的结果显示在Flutter应用中。

请根据实际情况调整代码和路径,确保一切配置正确。由于node_interop的使用可能涉及较复杂的上下文管理和类型转换,建议仔细阅读官方文档和示例代码以获取更多详细信息。

回到顶部