Flutter保持活动状态插件alive的使用
Flutter保持活动状态插件alive的使用
简介
Alive 是一个受 Socket.IO 和 Laravel Echo 启发的库,用于在多个平台上启用“实时”通信。当前实现适用于 Dart/Flutter。
[喜欢这个项目]
特性
当前功能:
- ✅ 消息广播
- ✅ 消息频道
路线图:
- ❌ 私有频道
- ❌ 认证
开始使用
在使用该库之前,请确保你已经有一个正在运行的服务器实例。
使用方法
连接到服务器并监听广播消息
import 'package:alive/alive.dart';
import 'package:flutter/material.dart';
late Client client;
void main() {
client = Client(url: 'ws://localhost:4000/');
client.connect();
client.on().listen((message) => print(message.data)); // 监听所有广播消息
runApp(const MyApp());
}
连接到服务器并监听特定频道
import 'package:alive/alive.dart';
import 'package:flutter/material.dart';
late Client client;
void main() {
client = Client(url: 'ws://localhost:4000/');
client.connect();
client.subscribe('test'); // 订阅名为'test'的频道
client.on('test').listen((message) => print(message.data)); // 监听特定频道的消息
runApp(const MyApp());
}
完整示例代码
以下是一个完整的示例代码,展示了如何使用 alive
插件来连接服务器、订阅频道并处理消息。
示例代码
文件:example/lib/main.dart
import 'package:alive/alive.dart';
import 'package:flutter/material.dart';
late Client client;
void main() async {
client = Client(url: 'ws://localhost:4000/'); // 替换为你的服务器地址
client.connect(closeOnError: false); // 连接服务器
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Alive example app'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool _subscribed = false; // 是否已订阅频道
[@override](/user/override)
void dispose() {
client.disconnect(); // 断开与服务器的连接
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
if (!_subscribed) {
client.subscribe('test'); // 订阅名为'test'的频道
} else {
client.unsubscribe('test'); // 取消订阅
}
setState(() {
_subscribed = !_subscribed;
});
},
child: Icon(
_subscribed ? Icons.pause : Icons.play_arrow,
),
),
body: Center(
child: StreamBuilder(
stream: client.on(channel: 'test'), // 监听特定频道的消息
builder: (BuildContext context, AsyncSnapshot<Message> snapshot) {
if (snapshot.hasData) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Channel: ${snapshot.data!.channel ?? 'Broadcast message (null)'}', // 显示频道名称
),
Text(
'Message: ${snapshot.data!.message!.toString()}', // 显示消息内容
style: Theme.of(context).textTheme.headline4,
),
],
);
} else {
return const CircularProgressIndicator(); // 加载指示器
}
}),
),
);
}
}
更多关于Flutter保持活动状态插件alive的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter保持活动状态插件alive的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 中,alive
是一个用于保持 Widget 活动状态的插件,它可以帮助你在页面切换时保持某些 Widget 的状态,而不是每次都重新创建。这对于需要保持复杂状态或避免重复计算的 Widget 非常有用。
安装 alive
插件
首先,你需要在 pubspec.yaml
文件中添加 alive
插件的依赖:
dependencies:
flutter:
sdk: flutter
alive: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
使用 alive
插件
alive
插件提供了一个 Alive
Widget,你可以将需要保持状态的 Widget 包裹在 Alive
中。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:alive/alive.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Alive Example'),
),
body: Column(
children: [
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
},
child: Text('Go to Second Screen'),
),
Alive(
child: CounterWidget(),
),
],
),
);
}
}
class SecondScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Screen'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Go Back'),
),
),
);
}
}
class CounterWidget extends StatefulWidget {
[@override](/user/override)
_CounterWidgetState createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _counter = 0;
[@override](/user/override)
Widget build(BuildContext context) {
return Column(
children: [
Text('Counter: $_counter'),
ElevatedButton(
onPressed: () {
setState(() {
_counter++;
});
},
child: Text('Increment'),
),
],
);
}
}