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 模式。

pub package License: MIT

使用示例

以下是一个完整的示例代码,展示了如何使用 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

1 回复

更多关于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 来安装依赖。

使用步骤

  1. 导入库

    在你的 Dart 文件中导入 mdns_bloc

    import 'package:mdns_bloc/mdns_bloc.dart';
    
  2. 创建 MdnsBloc 实例

    创建一个 MdnsBloc 实例,它将负责管理 mDNS 服务的发现和状态。

    final mdnsBloc = MdnsBloc();
    
  3. 监听 mDNS 服务

    你可以通过监听 MdnsBlocstream 来获取发现的 mDNS 服务:

    mdnsBloc.stream.listen((serviceInfo) {
      print('Found service: ${serviceInfo.name} on ${serviceInfo.ip}');
    });
    
  4. 开始发现服务

    使用 MdnsBlocstartDiscovery 方法来开始发现指定类型的 mDNS 服务:

    mdnsBloc.startDiscovery('_http._tcp');
    

    这里的 _http._tcp 是你要发现的服务类型。你可以根据需要替换为其他服务类型,如 _printer._tcp_ssh._tcp 等。

  5. 停止发现服务

    当你不再需要发现服务时,可以调用 stopDiscovery 方法来停止发现:

    mdnsBloc.stopDiscovery();
    
  6. 处理生命周期

    在 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}'),
          );
        },
      ),
    );
  }
}
回到顶部