Flutter网络通信插件socketnotifs的使用

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

Flutter网络通信插件SocketNotifs的使用

简介

SocketNotifs 是一个用于Flutter应用程序的Dart插件,它简化了WebSocket连接,并提供了通知功能。目前该插件仅支持Android平台,iOS平台由于Apple的APN系统限制,暂时不支持。

功能

  • 无缝建立WebSocket连接。
  • 完整的Android端实现,包括所需的权限和服务。

安装

pubspec.yaml 文件中添加依赖项:

dependencies:
  socketnotifs: <latest_version>

然后运行以下命令以获取依赖项:

flutter pub get

使用示例

下面是一个最小化的示例代码,展示了如何使用 SocketNotifs 插件:

import 'package:flutter/material.dart';
import 'package:socketnotifs/socketnotifs.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    // 连接到WebSocket服务器
    SocketNotifs.connectToWebSocket("ws://10.0.2.2:4000");
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: const Center(
          child: Text('Running on: drugs\n'), // 这里可以替换为实际的内容
        ),
      ),
    );
  }
}

Android权限

为了使用此插件,确保在 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />

<application>
    <service
        android:name="com.example.socketnotifs.WebSocketService"
        android:exported="true"
        android:foregroundServiceType="dataSync" />
</application>

服务器端示例(JavaScript)

以下是一个简单的Node.js服务器端示例,用于通过WebSocket发送通知:

const WebSocket = require("ws");
const express = require("express");
const app = express();
const port = 4000;

// 初始化WebSocket服务器
const wss = new WebSocket.Server({ noServer: true });

// WebSocket连接处理
wss.on("connection", (ws) => {
  console.log("Client connected");

  ws.on("close", () => {
    console.log("Client disconnected");
  });
});

// 升级HTTP服务器为WebSocket
app.server = app.listen(port, () => {
  console.log(`Server is listening on port ${port}`);
});

app.server.on("upgrade", (request, socket, head) => {
  wss.handleUpgrade(request, socket, head, (ws) => {
    wss.emit("connection", ws, request);
  });
});

function broadcastMessage(message, title) {
  wss.clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(JSON.stringify({ message, title }));
    }
  });
}

setInterval(() => {
  broadcastMessage("This is a test notification message!", "example");
  console.log("Broadcasting message...");
}, 5000);

路线图

  • 已完成:
    • Android端实现。

贡献

欢迎贡献!如果您有任何问题或改进建议,请随时提交issue或pull request。

许可证

本项目采用MIT许可证。


完整示例Demo

为了帮助您更好地理解如何使用 SocketNotifs 插件,以下是一个完整的示例项目,包含客户端和服务器端代码。

客户端代码(Flutter)

import 'package:flutter/material.dart';
import 'package:socketnotifs/socketnotifs.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _message = "Waiting for notifications...";

  @override
  void initState() {
    super.initState();
    // 连接到WebSocket服务器
    SocketNotifs.connectToWebSocket("ws://10.0.2.2:4000");

    // 监听来自服务器的通知
    SocketNotifs.onNotificationReceived.listen((notification) {
      setState(() {
        _message = "${notification.title}: ${notification.message}";
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('SocketNotifs Example'),
        ),
        body: Center(
          child: Text(_message),
        ),
      ),
    );
  }
}

服务器端代码(Node.js)

const WebSocket = require("ws");
const express = require("express");
const app = express();
const port = 4000;

// 初始化WebSocket服务器
const wss = new WebSocket.Server({ noServer: true });

// WebSocket连接处理
wss.on("connection", (ws) => {
  console.log("Client connected");

  ws.on("close", () => {
    console.log("Client disconnected");
  });
});

// 升级HTTP服务器为WebSocket
app.server = app.listen(port, () => {
  console.log(`Server is listening on port ${port}`);
});

app.server.on("upgrade", (request, socket, head) => {
  wss.handleUpgrade(request, socket, head, (ws) => {
    wss.emit("connection", ws, request);
  });
});

function broadcastMessage(message, title) {
  wss.clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(JSON.stringify({ message, title }));
    }
  });
}

setInterval(() => {
  broadcastMessage("This is a test notification message!", "example");
  console.log("Broadcasting message...");
}, 5000);

更多关于Flutter网络通信插件socketnotifs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络通信插件socketnotifs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,socketnotifs 插件可以用于处理网络通信,特别是通过WebSocket进行实时数据通信。虽然socketnotifs这个具体名称在Flutter社区中可能不是非常常见(可能是某个特定项目或自定义插件的名称),但我会给出一个使用标准Flutter插件web_socket_channel来实现WebSocket通信的示例。这个插件是官方推荐的用于Flutter的WebSocket通信库。

首先,确保在你的pubspec.yaml文件中添加web_socket_channel依赖:

dependencies:
  flutter:
    sdk: flutter
  web_socket_channel: ^2.1.0  # 请检查最新版本号

然后,运行flutter pub get来获取依赖。

下面是一个使用web_socket_channel的简单示例,展示如何建立WebSocket连接、发送消息和接收消息:

import 'package:flutter/material.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'dart:async';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: WebSocketDemo(),
    );
  }
}

class WebSocketDemo extends StatefulWidget {
  @override
  _WebSocketDemoState createState() => _WebSocketDemoState();
}

class _WebSocketDemoState extends State<WebSocketDemo> {
  WebSocketChannel? _channel;
  TextEditingController _controller = TextEditingController();
  String _response = '';

  @override
  void initState() {
    super.initState();
    connectToWebSocket();
  }

  void connectToWebSocket() {
    _channel = WebSocketChannel.connect(Uri.parse('wss://your-websocket-url'));
    _channel!.stream.listen(
      (message) {
        setState(() {
          _response = message;
        });
      },
      onError: (error) {
        print('WebSocket error: $error');
      },
      onDone: () {
        print('WebSocket closed');
      },
    );
  }

  void sendMessage() {
    if (_channel != null && _controller.text.isNotEmpty) {
      _channel!.sink.add(_controller.text);
      _controller.clear();
    }
  }

  @override
  void dispose() {
    _controller.dispose();
    _channel?.sink.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebSocket Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text('Response:', style: TextStyle(fontSize: 18)),
            SizedBox(height: 10),
            Flexible(
              child: SingleChildScrollView(
                scrollDirection: Axis.vertical,
                child: Text(_response, style: TextStyle(fontSize: 16)),
              ),
            ),
            SizedBox(height: 20),
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                labelText: 'Send a message',
                border: OutlineInputBorder(),
              ),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: sendMessage,
              child: Text('Send'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. WebSocketChannel.connect(Uri.parse('wss://your-websocket-url')) 用于连接到WebSocket服务器。请将'wss://your-websocket-url'替换为你的WebSocket服务器URL。
  2. 使用_channel!.stream.listen(...)来监听从服务器接收到的消息。
  3. 使用_channel!.sink.add(...)来发送消息到服务器。
  4. 在UI中,有一个文本输入框用于输入消息,一个按钮用于发送消息,以及一个文本区域用于显示从服务器接收到的消息。

这个示例展示了如何在Flutter应用中使用WebSocket进行基本的网络通信。如果你的socketnotifs插件有特定的API或用法,请查阅其官方文档或源代码以获取更多信息。

回到顶部