Flutter未知功能插件i_spy的使用(注:由于插件介绍为undefined,以下功能为基于名称的合理推测) 或者更具体一些(假设i_spy具有某种监视或检测功能): Flutter环境监视插件i_spy的使用

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

Flutter环境监视插件i_spy的使用

视觉软件解决方案i_spy: OBSERVER, MEDIATOR和事件处理的最佳实践

在目睹了Flutter的InheritedWidgetProvider包的混乱后,我们决定“不再需要它们”。

插件i_spy提供了OBSERVER和MEDIATOR的现成实现。它通过通用方法简化了概念,并促进了软件工程领域的专业性和更好的理解。

MVC和MVVM是经典可靠的UI架构模式。遗憾的是,现代框架倾向于鼓励新手程序员远离这些模式,转而采用复杂的特定抽象,这导致了紧耦合,并使他们依赖于特定框架的方式思考,这在我看来是一个明显的供应商锁定和狼票反模式的标志。

特性

  • 提供现成的OBSERVER和MEDIATOR实现。
  • 提供不可变和可变选项。
  • 支持MVC/MVVM风格架构,具有松散耦合。
  • 使用泛型来满足用户可能希望利用编译器并只对特定事件感兴趣的场景。
  • 提供简单的领域事件实现。
  • 包含构建审计日志所需的构建块,这是实时数据处理的基础。

开始使用

i_spy插件完全由Dart编写,适用于任何Dart 3+运行时环境。

使用示例

查看示例文件example/i_spy_example.dart和单元测试文件test/i_spy_test.dart以了解如何使用。

示例代码

/// 基本演示如何OBSERVER和MEDIATOR可以在两个组件之间实现解耦。
/// [Pinger]和[Ponger]彼此并不知道对方的存在。
final ping = Pinger();
final pong = Ponger();
final scribe = Scribe();

/// 它们也不知道有一个[Scribe]记录正在发生的事情。
/// 这种松耦合在许多UI环境中非常有用。
ping.ping();
pong.pong();
scribe.update(Finished());
import 'dart:math';

import 'package:i_spy/i_spy.dart';

// 定义事件类型
final class Ping implements Event {}
final class Pong implements Event {}

// 随机数生成器
final fate = Random();

// Pinger 类实现 Observable 和 Observer 接口
final class Pinger implements Observable<Event>, Observer<Event> {
  Pinger() {
    SimpleEventingSystem.instance.add(this);
  }
  
  [@override](/user/override)
  void notifyObservers(Event e) {
    SimpleEventingSystem.instance.notifyObservers(e);
  }

  // 发送 Ping 事件
  void ping() => notifyObservers(Ping());

  [@override](/user/override)
  void update(final Event e) {
    if (e is Pong) {
      if (fate.nextBool()) {
        ping();
      }
    }
  }
}

// Scribe 类实现 Observer 接口
final class Scribe implements Observer<Event> {
  Scribe() {
    SimpleEventingSystem.instance.add(this);
  }
  
  [@override](/user/override)
  void update(final Event e) {
    print(e.runtimeType);
  }
}

// Ponger 类实现 Observable 和 Observer 接口
final class Ponger implements Observable<Event>, Observer<Event> {
  Ponger() {
    SimpleEventingSystem.instance.add(this);
  }
  
  [@override](/user/override)
  void notifyObservers(final Event e) {
    SimpleEventingSystem.instance.notifyObservers(e);
  }

  [@override](/user/override)
  void update(final Event e) {
    if (e is Ping) {
      if (fate.nextBool()) {
        pong();
      }
    }
  }

  // 发送 Pong 事件
  void pong() => notifyObservers(Pong());
}

// 定义完成事件
final class Finished implements Event {}

void main() {
  /// 基本演示如何OBSERVER和MEDIATOR可以在两个组件之间实现解耦。
  /// [Pinger]和[Ponger]彼此并不知道对方的存在。
  final ping = Pinger();
  final pong = Ponger();
  final scribe = Scribe();

  /// 它们也不知道有一个[Scribe]记录正在发生的事情。
  /// 这种松耦合在许多UI环境中非常有用。
  ping.ping();
  pong.pong();
  scribe.update(Finished());

  /// 此示例仅展示了允许所有类型的[Event]的[SimpleEventingSystem]。
  /// 当不介意有更多实例存在以确保类型安全时,可以使用受约束的泛型版本的[Observer],[Observable]和[Mediator]。
  /// 可以查看单元测试以获取更多信息。
}

更多关于Flutter未知功能插件i_spy的使用(注:由于插件介绍为undefined,以下功能为基于名称的合理推测) 或者更具体一些(假设i_spy具有某种监视或检测功能): Flutter环境监视插件i_spy的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter未知功能插件i_spy的使用(注:由于插件介绍为undefined,以下功能为基于名称的合理推测) 或者更具体一些(假设i_spy具有某种监视或检测功能): Flutter环境监视插件i_spy的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,虽然没有一个官方或广泛认可的插件名为 i_spy,但基于你提出的假设——即 i_spy 插件具有某种监视或检测功能,我们可以构想一个类似的插件实现。由于实际的 i_spy 插件不存在,以下代码将展示如何使用 Flutter 和一些现有的插件来实现设备环境监视功能。

示例:Flutter 环境监视应用

我们将使用 device_info_plus 插件来获取设备信息,package_info_plus 插件来获取应用包信息,以及 sensors 插件来获取设备的传感器数据(如加速度计)。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  device_info_plus: ^3.0.0
  package_info_plus: ^1.0.0
  sensors: ^0.6.4+3

2. 获取设备信息

创建一个 Dart 文件(例如 device_info.dart)来获取并显示设备信息:

import 'package:flutter/material.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:package_info_plus/package_info_plus.dart';

class DeviceInfoScreen extends StatefulWidget {
  @override
  _DeviceInfoScreenState createState() => _DeviceInfoScreenState();
}

class _DeviceInfoScreenState extends State<DeviceInfoScreen> {
  DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
  PackageInfo? packageInfo;

  @override
  void initState() {
    super.initState();
    _getDeviceInfo();
    _getPackageInfo();
  }

  Future<void> _getDeviceInfo() async {
    if (kIsWeb) {
      // Web doesn't support platform messages.
      Map<String, String> webBrowserInfo = {
        'userAgent': window.navigator.userAgent,
        'language': window.navigator.language,
      };
      print(webBrowserInfo);
    } else {
      DeviceInfo deviceInfo = await deviceInfoPlugin.androidInfo ??
          await deviceInfoPlugin.iosInfo ??
          await deviceInfoPlugin.webBrowserInfo;
      print(deviceInfo);
    }
  }

  Future<void> _getPackageInfo() async {
    PackageInfo _packageInfo = await PackageInfo.fromPlatform();
    setState(() {
      packageInfo = _packageInfo;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Device Info'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            if (packageInfo != null)
              Text('App Name: ${packageInfo!.appName}'),
            if (packageInfo != null)
              Text('Package Name: ${packageInfo!.packageName}'),
            if (packageInfo != null)
              Text('Version: ${packageInfo!.version}'),
            // Add more Text widgets here to display other device info
          ],
        ),
      ),
    );
  }
}

3. 获取传感器数据

创建一个 Dart 文件(例如 sensor_info.dart)来获取并显示传感器数据:

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

class SensorInfoScreen extends StatefulWidget {
  @override
  _SensorInfoScreenState createState() => _SensorInfoScreenState();
}

class _SensorInfoScreenState extends State<SensorInfoScreen> {
  late AccelerometerEvent _lastAccelerometerEvent;

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

  void _accelerometerListener() {
    accelerometerEvents.listen((AccelerometerEvent event) {
      setState(() {
        _lastAccelerometerEvent = event;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sensor Info'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('X: ${_lastAccelerometerEvent.x.toStringAsFixed(2)}'),
            Text('Y: ${_lastAccelerometerEvent.y.toStringAsFixed(2)}'),
            Text('Z: ${_lastAccelerometerEvent.z.toStringAsFixed(2)}'),
          ],
        ),
      ),
    );
  }
}

4. 主应用入口

main.dart 中,创建导航到不同信息屏幕的按钮:

import 'package:flutter/material.dart';
import 'device_info.dart';
import 'sensor_info.dart';

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

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Environment Monitor'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => DeviceInfoScreen()),
                );
              },
              child: Text('Device Info'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => SensorInfoScreen()),
                );
              },
              child: Text('Sensor Info'),
            ),
          ],
        ),
      ),
    );
  }
}

总结

以上代码展示了如何使用 Flutter 和一些现有的插件来实现基本的设备信息获取和传感器数据监视功能。尽管这不是一个真正的 i_spy 插件,但它提供了一个起点,你可以根据需要进一步扩展和定制这些功能。

回到顶部