Flutter高效工具或向导功能插件wiz的使用

Flutter高效工具或向导功能插件wiz的使用

本README描述了wiz包的功能。如果您将此包发布到pub.dev,则此README的内容将出现在您的包的首页上。

特性

  • 发现WiZ设备
  • 开关控制(开/关)
  • 设置/获取RGB颜色
  • 获取温度
  • 设置冷白色
  • 设置暖白色
  • 设置/获取亮度
  • 设置场景

开始使用

发现功能通过UDP广播请求来实现,并收集网络中的所有灯泡。

// 创建一个WiZ灯泡实例。构造函数需要灯泡的IP地址。
WizLight(): 创建一个WiZ灯泡实例。构造函数需要灯泡的IP地址。

灯泡参数(UDP RAW)

  • sceneId - 调用预定义的场景之一(整数,范围从1到32)。代码中包含列表名。
  • speed - 设置颜色变化速度(百分比)。
  • dimming - 设置灯泡的调光程度(百分比)。
  • temp - 设置色温(开尔文)。
  • r - 红色颜色范围(0-255)。
  • g - 绿色颜色范围(0-255)。
  • b - 蓝色颜色范围(0-255)。
  • c - 冷白色范围(0-255)。
  • w - 暖白色范围(0-255)。
  • id - 灯泡ID。
  • state - 是否开启或关闭。
  • schdPsetId - 房间节奏ID。

使用示例

通过广播数据报(UDP)发现网络中的所有灯泡。 该函数接收发现对象并返回一个WiZ灯泡对象列表。

注意: 请使用由函数返回的wifiBroadcast值作为广播空间,以避免在物理设备上运行项目时出现问题。

final info = NetworkInfo();
final wifiBroadcast = await info.getWifiBroadcast();
await findWizlights(broadcastSpace: wifiBroadcast ?? "255.255.255.255");

示例UDP请求

向灯泡发送消息:

{"method":"setPilot","params":{"r":255,"g":255,"b":255,"dimming":50}}

响应:

{"method":"setPilot","env":"pro","result":{"success":true}}

获取灯泡状态:

{"method":"getPilot","params":{}}

响应:

import 'package:example/light_control.dart';
import 'package:flutter/material.dart';
import 'package:network_info_plus/network_info_plus.dart';
import 'package:wiz/wiz.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Wiz example'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<WizLight> wizLight = [];

  bool isLoading = false;

  void _incrementCounter() async {
    setState(() {
      isLoading = true;
    });
    final info = NetworkInfo();

    final wifiBroadcast = await info.getWifiBroadcast();

    debugPrint(wifiBroadcast);

    wizLight = await findWizlights(broadcastSpace: wifiBroadcast ?? "255.255.255.255");
    setState(() {
      isLoading = false;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
          child: isLoading
              ? const CircularProgressIndicator()
              : ListView.builder(
                  itemCount: wizLight.length,
                  itemBuilder: (context, index) {
                    return _Bulb(wizLight: wizLight[index]);
                  },
                )),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.sync),
      ),
    );
  }
}

class _Bulb extends StatefulWidget {
  const _Bulb({required this.wizLight});

  final WizLight wizLight;

  [@override](/user/override)
  State<_Bulb> createState() => __BulbState();
}

class __BulbState extends State<_Bulb> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return FutureBuilder<Map<String, dynamic>>(
        future: widget.wizLight.status,
        builder: (_, snapshot) {
          if (snapshot.hasData) {
            return GestureDetector(
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => LightControl(
                            wizLight: widget.wizLight,
                          )),
                );
              },
              child: ListTile(
                  leading: Icon(
                    Icons.light,
                    color: Color.fromRGBO(widget.wizLight.rgb[0],
                        widget.wizLight.rgb[1], widget.wizLight.rgb[2], 1),
                  ),
                  title: Text(widget.wizLight.ip),
                  subtitle: Text(widget.wizLight.mac),
                  trailing: _Switch(
                      lightOn: snapshot.data?.keys.contains('result') ?? false
                          ? snapshot.data?['result']?['state'] ?? false
                          : false,
                      wizLight: widget.wizLight)),
            );
          } else {
            return Container();
          }
        });
  }
}

class _Switch extends StatefulWidget {
  const _Switch({
    required this.lightOn,
    required this.wizLight,
  });

  final bool lightOn;
  final WizLight wizLight;

  [@override](/user/override)
  State<_Switch> createState() => _SwitchState();
}

class _SwitchState extends State<_Switch> {
  late bool isLo;

  [@override](/user/override)
  void initState() {
    isLo = widget.lightOn;
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Switch(
      value: isLo,
      activeColor: Colors.red,
      onChanged: (bool value) {
        setState(() {
          isLo = value;
        });
        !isLo
            ? widget.wizLight.turnOff()
            : widget.wizLight.turnOn(PilotBuilder(brightness: 255));
      },
    );
  }
}

更多关于Flutter高效工具或向导功能插件wiz的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter高效工具或向导功能插件wiz的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


基于Flutter插件名称“wiz”的介绍为“undefined”的情况,我们可以做一些合理的推测,并尝试构建一个假设性的使用案例。由于“wiz”可能意味着某种向导(Wizard)或智能助手(Wizardry)的功能,我们可以假设这个插件旨在提供某种高效工具或向导功能,帮助开发者快速实现某些复杂功能。

以下是一个假设性的Flutter插件wiz的使用案例,展示了如何在一个Flutter应用中集成并使用这个插件(请注意,由于wiz插件是假设性的,以下代码仅为示例,并非真实存在的插件实现):

假设性的wiz插件使用案例

1. 添加插件依赖

首先,我们需要在pubspec.yaml文件中添加对wiz插件的依赖(请注意,这里的wiz是一个假设性的包名,实际使用时需要替换为真实存在的包名):

dependencies:
  flutter:
    sdk: flutter
  wiz: ^1.0.0  # 假设性的版本号

2. 导入插件

在需要使用wiz插件的Dart文件中导入它:

import 'package:wiz/wiz.dart';

3. 使用wiz插件的功能

假设wiz插件提供了一个向导功能,用于引导用户完成一系列步骤。以下是一个使用WizWizard类来创建和显示向导的示例:

import 'package:flutter/material.dart';
import 'package:wiz/wiz.dart';  // 假设性的导入

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

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

class WizExampleScreen extends StatefulWidget {
  @override
  _WizExampleScreenState createState() => _WizExampleScreenState();
}

class _WizExampleScreenState extends State<WizExampleScreen> {
  WizWizard? _wizard;

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

    // 初始化向导
    _wizard = WizWizard(
      steps: [
        WizStep(
          title: 'Step 1: Introduction',
          content: Text('This is the introduction step.'),
          onNext: () => print('Moving to the next step...'),
        ),
        WizStep(
          title: 'Step 2: Input Data',
          content: TextField(
            decoration: InputDecoration(labelText: 'Enter some data'),
          ),
          onNext: (context) {
            // 这里可以获取用户输入的数据并进行处理
            final TextField textField = context.findChildByType<TextField>()!;
            final String input = textField.controller!.text;
            print('User input: $input');
            return true;  // 返回true表示可以继续到下一步
          },
        ),
        WizStep(
          title: 'Step 3: Completion',
          content: Text('Congratulations! You have completed the wizard.'),
          onNext: null,  // 最后一步没有下一步按钮
        ),
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Wiz Wizard Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () => _showWizard(context),
          child: Text('Start Wizard'),
        ),
      ),
    );
  }

  void _showWizard(BuildContext context) {
    // 显示向导
    _wizard!.show(context);
  }
}

// 假设性的WizStep类
class WizStep {
  final String title;
  final Widget content;
  final Function? onNext;  // 下一步的回调函数,可以传入一个上下文以访问当前步骤的Widget

  WizStep({required this.title, required this.content, this.onNext});
}

// 假设性的WizWizard类
class WizWizard {
  final List<WizStep> steps;

  WizWizard({required this.steps});

  void show(BuildContext context) {
    // 这里应该是显示向导的逻辑,但由于篇幅限制,仅作简单示例
    // 可以使用Navigator或Dialog等Flutter组件来显示向导步骤
    // ...
    print('Wizard is showing...');

    // 假设性的逻辑:按顺序显示每个步骤
    for (final step in steps) {
      // 显示步骤内容(这里仅作打印示例)
      print('Step title: ${step.title}');
      print('Step content: ${step.content.runtimeType}');

      // 如果有下一步回调,则调用它(这里仅作示例,实际上需要处理回调逻辑)
      if (step.onNext != null) {
        // 注意:这里的context传递是假设性的,实际使用时需要更复杂的逻辑来处理
        step.onNext!(context);
      }
    }
  }
}

注意

  1. 假设性代码:上述代码完全基于假设性的wiz插件功能。在实际使用中,你需要根据真实插件的API文档来编写代码。
  2. 插件不存在:由于wiz插件是假设性的,因此在实际Flutter生态系统中可能不存在。你需要查找并集成一个真实存在的、符合你需求的Flutter插件。
  3. API差异:真实插件的API可能与上述示例中的假设性API有所不同。务必参考插件的官方文档和示例代码。

希望这个假设性的使用案例能够帮助你理解如何在Flutter应用中集成和使用一个假设性的向导功能插件。

回到顶部