Flutter mDNS服务发现插件mdns_bloc的使用
Flutter mDNS服务发现插件mdns_bloc的使用
在本文中,我们将介绍如何使用 mdns_bloc
插件来实现 Flutter 应用程序中的 mDNS 服务发现。mdns_bloc
是一个基于 Bloc 模式的 Flutter 库,用于通过多播 DNS 进行服务发现。
mdns_bloc
mdns_bloc
是一个 Flutter 库,用于通过多播 DNS(mDNS)进行服务发现,使用了 Bloc 模式。
使用示例
以下是一个完整的示例代码,展示了如何使用 mdns_bloc
来发现 mDNS 服务。
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mdns_bloc/mdns_bloc.dart';
import 'package:mdns_bloc/mdns_event.dart';
import 'package:mdns_bloc/mdns_state.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => MDnsBloc()
..add(const MDnsEventStartSearch(
serverPointer: '_http._tcp', service: 'example._http._tcp.local')),
child: const MyAppView(),
);
}
}
class MyAppView extends StatelessWidget {
const MyAppView({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return BlocBuilder<MDnsBloc, MDnsState>(builder: (context, state) {
// 根据状态的不同显示不同的UI
switch (state.status) {
case MDnsStatus.initial:
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('mDNS 扫描'),
),
body: SafeArea(
child: Container(
padding: const EdgeInsets.all(12.0),
child: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(
width: 60,
height: 60,
child: CircularProgressIndicator(),
),
Padding(
padding: EdgeInsets.only(top: 16),
child: Text('正在搜索...'),
),
],
),
),
),
),
),
);
case MDnsStatus.mDnsScanned:
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('mDNS 扫描完成'),
actions: [
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () {
context.read<MDnsBloc>().add(
const MDnsEventStartSearch(
serverPointer: '_http._tcp'),
);
},
),
],
),
body: SafeArea(
child: Container(
padding: const EdgeInsets.all(12.0),
child: const Center(
child: Text('未找到服务'),
),
),
),
),
);
case MDnsStatus.mDnsFound:
case MDnsStatus.mDnsMatch:
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('mDNS 扫描完成'),
actions: [
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () {
context.read<MDnsBloc>().add(
const MDnsEventStartSearch(
serverPointer: '_http._tcp'),
);
},
),
],
),
body: SafeArea(
child: Container(
padding: const EdgeInsets.all(12.0),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Flexible(
child: Container(
padding: const EdgeInsets.all(12.0),
child: Text(
"检测到 ${state.dnsSrvRecords.length} 个服务:",
),
),
),
Expanded(
child: ListView.builder(
shrinkWrap: true,
itemCount: state.dnsSrvRecords.length,
itemBuilder: (context, index) {
var keys = state.dnsSrvRecords.keys.toList();
var name = keys[index].name;
return ListTile(
title: Text(
'$name - ${state.dnsSrvRecords[keys[index]]?.address.address}',
),
tileColor: name == state.service?.name
? Colors.lightBlue
: null,
);
},
),
),
],
),
),
),
),
);
case MDnsStatus.error:
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('mDNS 扫描错误'),
),
body: SafeArea(
child: Container(
padding: const EdgeInsets.all(12.0),
child: Text(
'扫描时发生错误: ${state.errorMsg}.\n\n\n最终状态为: $state',
),
),
),
),
);
}
});
}
}
更多关于Flutter mDNS服务发现插件mdns_bloc的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter mDNS服务发现插件mdns_bloc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
mdns_bloc
是一个用于 Flutter 的 mDNS(Multicast DNS)服务发现插件,它基于 BLoC(Business Logic Component)模式。通过使用 mdns_bloc
,你可以在 Flutter 应用中轻松发现局域网内的 mDNS 服务。
安装
首先,你需要在 pubspec.yaml
文件中添加 mdns_bloc
依赖:
dependencies:
flutter:
sdk: flutter
mdns_bloc: ^0.0.1 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
使用步骤
-
导入库
在你的 Dart 文件中导入
mdns_bloc
:import 'package:mdns_bloc/mdns_bloc.dart';
-
创建 MdnsBloc 实例
创建一个
MdnsBloc
实例,它将负责管理 mDNS 服务的发现和状态。final mdnsBloc = MdnsBloc();
-
监听 mDNS 服务
你可以通过监听
MdnsBloc
的stream
来获取发现的 mDNS 服务:mdnsBloc.stream.listen((serviceInfo) { print('Found service: ${serviceInfo.name} on ${serviceInfo.ip}'); });
-
开始发现服务
使用
MdnsBloc
的startDiscovery
方法来开始发现指定类型的 mDNS 服务:mdnsBloc.startDiscovery('_http._tcp');
这里的
_http._tcp
是你要发现的服务类型。你可以根据需要替换为其他服务类型,如_printer._tcp
、_ssh._tcp
等。 -
停止发现服务
当你不再需要发现服务时,可以调用
stopDiscovery
方法来停止发现:mdnsBloc.stopDiscovery();
-
处理生命周期
在 Flutter 中,通常需要处理
MdnsBloc
的生命周期。你可以在initState
中启动发现,并在dispose
中停止发现并释放资源:[@override](/user/override) void initState() { super.initState(); mdnsBloc.startDiscovery('_http._tcp'); } [@override](/user/override) void dispose() { mdnsBloc.stopDiscovery(); mdnsBloc.close(); super.dispose(); }
完整示例
以下是一个完整的示例,展示了如何在 Flutter 应用中使用 mdns_bloc
发现 _http._tcp
服务:
import 'package:flutter/material.dart';
import 'package:mdns_bloc/mdns_bloc.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: MdnsDiscoveryScreen(),
);
}
}
class MdnsDiscoveryScreen extends StatefulWidget {
[@override](/user/override)
_MdnsDiscoveryScreenState createState() => _MdnsDiscoveryScreenState();
}
class _MdnsDiscoveryScreenState extends State<MdnsDiscoveryScreen> {
final mdnsBloc = MdnsBloc();
List<ServiceInfo> services = [];
[@override](/user/override)
void initState() {
super.initState();
mdnsBloc.startDiscovery('_http._tcp');
mdnsBloc.stream.listen((serviceInfo) {
setState(() {
services.add(serviceInfo);
});
});
}
[@override](/user/override)
void dispose() {
mdnsBloc.stopDiscovery();
mdnsBloc.close();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('mDNS Discovery'),
),
body: ListView.builder(
itemCount: services.length,
itemBuilder: (context, index) {
final service = services[index];
return ListTile(
title: Text(service.name),
subtitle: Text('${service.ip}:${service.port}'),
);
},
),
);
}
}