Flutter重生/恢复状态插件phoenix_wings的使用

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

Flutter重生/恢复状态插件 phoenix_wings 的使用

phoenix_wings 是一个用于 Dart 的 Phoenix Channel 实现,旨在匹配 JavaScript 实现的功能。本文将详细介绍如何在 Flutter 中使用该插件。

1. 安装和导入

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

dependencies:
  phoenix_wings: ^x.x.x  # 使用最新版本号替换 x.x.x

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

导入和连接 (VM/Flutter)

在 Dart 文件中导入包:

import 'package:phoenix_wings/phoenix_wings.dart';

创建一个新的 WebSocket 连接:

final socket = PhoenixSocket("ws://localhost:4000/socket/websocket");

你还可以传递参数进行身份验证:

final socket = PhoenixSocket(
  "ws://localhost:4000/socket/websocket",
  socketOptions: PhoenixSocketOptions(params: {"user_token": 'your_user_token'}),
);

可选参数

  • timeout: 等待响应的时间(毫秒)。默认值为 10000。
  • heartbeatIntervalMs: 心跳间隔时间(毫秒)。默认值为 30000。
  • reconnectAfterMs: 重新连接尝试之间的间隔时间(毫秒)列表。
  • params: 连接到 Phoenix 后端时发送的参数。

2. 常用操作

连接到服务器:

await socket.connect();

创建并加入一个频道:

final chatChannel = socket.channel("room:chat", {"id": "myId"});

// 监听特定事件
chatChannel.on("user_entered", (Map payload, String ref, String joinRef) {
  print(payload);  // 打印接收到的消息
});

// 加入频道
chatChannel.join();

3. 示例 Demo

下面是一个完整的 Flutter 示例应用,展示了如何与 Phoenix Channels 进行通信。

3.1 设置 Phoenix Server

确保你已经有一个运行中的 Phoenix 服务器,并且它监听 WebSocket 请求。假设服务器地址是 ws://10.0.0.2:4000/socket/websocket

3.2 Flutter 应用示例

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Phoenix Wings Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final PhoenixSocket _socket = PhoenixSocket("ws://10.0.0.2:4000/socket/websocket");

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

  void connectToServer() async {
    await _socket.connect();

    final chatChannel = _socket.channel("room:chat", {"id": "myId"});

    // 监听用户进入事件
    chatChannel.on("user_entered", (Map payload, String ref, String joinRef) {
      setState(() {
        print("User entered with payload: $payload");
      });
    });

    // 加入频道
    chatChannel.join().then((_) {
      print("Joined channel successfully!");
    }).catchError((error) {
      print("Failed to join channel: $error");
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Phoenix Channels Example'),
      ),
      body: Center(
        child: Text('Check the console for messages!'),
      ),
    );
  }
}

3.3 配置代理(仅限模拟器)

如果你在 Android 模拟器上运行应用,请确保配置正确的 IP 地址和端口。可以通过以下命令检查你的 IP 地址:

ifconfig

假设你的 IP 地址是 10.0.0.2,那么你应该将 Flutter 应用中的 WebSocket URL 修改为:

final socket = PhoenixSocket("ws://10.0.0.2:4000/socket/websocket");

4. 测试

大部分测试可以在 VM 上运行,但 PhoenixHtmlConnection 测试需要在浏览器中运行。你可以通过以下命令运行测试:

pub run test

更多关于Flutter重生/恢复状态插件phoenix_wings的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter重生/恢复状态插件phoenix_wings的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,phoenix_wings 是一个用于在 Flutter 中实现重生/恢复状态的插件。它通常用于在应用程序崩溃或被杀掉后恢复其先前的状态。以下是如何在 Flutter 项目中使用 phoenix_wings 插件的示例代码。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 phoenix_wings 依赖:

dependencies:
  flutter:
    sdk: flutter
  phoenix_wings: ^x.y.z  # 请使用最新版本号

运行 flutter pub get 以获取依赖项。

2. 配置插件

在你的 Flutter 应用程序的主入口文件(通常是 main.dart)中,你需要配置 PhoenixWings 插件。

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

void main() {
  PhoenixWings.configure(
    // 配置重生策略,比如是否需要在每次启动时都尝试恢复状态
    shouldRebirth: (reason) {
      // 根据崩溃原因决定是否重生
      // reason 是一个枚举,包含崩溃的各种原因,如 killedBySystem, crashed 等
      return reason == RebirthReason.killedBySystem || reason == RebirthReason.crashed;
    },
    // 重生后的回调
    onRebirth: (savedState) {
      // savedState 是重生之前保存的状态
      // 在这里恢复应用的状态
      print('App rebirthed with saved state: $savedState');
    },
    // 保存状态的回调
    onSaveInstanceState: (stateToSave) async {
      // 在这里保存应用的状态
      // 例如保存 UI 状态、用户数据等
      stateToSave['uiState'] = 'exampleState';
      // 你也可以在这里执行异步操作,比如保存到数据库或远程服务器
      // await someAsyncFunction();
    },
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

3. 使用保存和恢复的状态

在上述代码中,onSaveInstanceState 回调用于保存应用状态,而 onRebirth 回调用于恢复应用状态。你可以根据需要修改这些回调中的逻辑,以保存和恢复特定的状态。

注意事项

  1. 状态管理:如果你的应用使用了更复杂的状态管理(如 Redux、MobX 或 Flutter 的 Provider),你可能需要在 onSaveInstanceStateonRebirth 中处理这些状态管理逻辑。
  2. 持久化存储:如果你需要在应用被完全卸载后仍然保留状态,你可能需要将状态保存到持久化存储(如 SQLite、SharedPreferences 或远程服务器)。

希望这个示例能帮助你在 Flutter 项目中成功使用 phoenix_wings 插件!

回到顶部