Flutter光学处理插件optics的使用

Flutter光学处理插件optics的使用

optics 是一个用于 Dart 的棱镜和透镜包。它允许你查看和修改不可变结构中具有可空值的属性(通过棱镜)或非空值的属性(通过透镜)。

棱镜

棱镜允许你查看和修改不可变结构中具有可空值的属性。

透镜

透镜类似于棱镜,可以让你查看和修改属性,但与棱镜不同的是,透镜的属性被假定为非空值。

使用示例

以下是一个完整的示例,展示了如何使用 optics 包来操作对象的属性。

import 'package:meta/meta.dart';
import 'package:optics/optics.dart';

void main() {
  // 创建一个人的对象
  Person person = Person(
    name: 'Joe',
    address: Address(streetName: '123 Capital of Texas Hwy'),
  );

  // 验证初始地址
  assert(person.address.streetName == '123 Capital of Texas Hwy');

  // Joe 搬家了!
  person = person.addressOptic.compound(AddressOptics.streetName).set(
        '456 Mesa Dr',
      );

  // 验证新的地址
  assert(person.address.streetName == '456 Mesa Dr');

  // Joe 找到了工作!
  person = BoundPrism(source: person, prism: PersonOptics.job).set(
    Job(address: Address(streetName: '789 E 6th St'), title: 'Sales bro'),
  );

  // 验证新工作
  assert(person.job?.title == 'Sales bro');

  // Joe 获得了晋升!
  final personJobTitle = PersonOptics.job.compound(JobOptics.title.asPrism());
  person = personJobTitle.set(person, 'Executive sales bro');

  // 验证新职位
  assert(person.job?.title == 'Executive sales bro');

  // 输出信息
  print('''Howdy, ${person.name}!
You're ${personJobTitle.get(person)?.indefiniteArticle()} ${personJobTitle.get(person)}.
Nice place you've got @ ${person.addressOptic.compound(AddressOptics.streetName)()}.''');
}

// 定义Person类
[@immutable](/user/immutable)
class Person {
  const Person({
    required this.name,
    required this.address,
    this.job,
  });

  final String name;

  final Address address;

  final Job? job;

  Person copyWith({
    String? name,
    Address? address,
    Job? job,
  }) =>
      Person(
        name: name ?? this.name,
        address: address ?? this.address,
        job: job ?? this.job,
      );

  [@override](/user/override)
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is Person &&
          name == other.name &&
          address == other.address &&
          job == other.job;

  [@override](/user/override)
  int get hashCode => Object.hash(name, address, job);
}

// Person扩展
extension PersonOptics on Person {
  static final Lens<Person, Address> address = Lens(
    getter: (subject) => subject.address,
    setter: (subject, value) => subject.copyWith(address: value),
  );

  static final Prism<Person, Job?> job = Prism(
    getter: (subject) => subject.job,
    setter: (subject, value) => subject.copyWith(job: value),
  );

  BoundLens<Person, Address> get addressOptic =>
      BoundLens(source: this, lens: address);

  BoundPrism<Person, Job?> get jobOptic => BoundPrism(source: this, prism: job);
}

// 定义Address类
[@immutable](/user/immutable)
class Address {
  const Address({required this.streetName});

  final String streetName;

  Address copyWith({String? streetName}) => Address(
        streetName: streetName ?? this.streetName,
      );

  [@override](/user/override)
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is Address && streetName == other.streetName;

  [@override](/user/override)
  int get hashCode => streetName.hashCode;
}

// Address扩展
extension AddressOptics on Address {
  static final Lens<Address, String> streetName = Lens(
    getter: (subject) {
      return subject.streetName;
    },
    setter: (subject, value) {
      return subject.copyWith(streetName: value);
    },
  );

  BoundLens<Address, String> get streetNameOptic =>
      BoundLens(source: this, lens: streetName);
}

// 定义Job类
[@immutable](/user/immutable)
class Job {
  Job({
    required this.address,
    required this.title,
  });

  final String title;

  final Address address;

  Job copyWith({String? title, Address? address}) => Job(
        title: title ?? this.title,
        address: address ?? this.address,
      );

  [@override](/user/override)
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is Job && title == other.title && address == other.address;

  [@override](/user/override)
  int get hashCode => Object.hash(title, address);
}

// Job扩展
extension JobOptics on Job {
  static final Lens<Job, String> title = Lens(
    getter: (subject) {
      return subject.title;
    },
    setter: (subject, value) {
      return subject.copyWith(title: value);
    },
  );

  static final Lens<Job, Address> address = Lens(
    getter: (subject) {
      return subject.address;
    },
    setter: (subject, value) {
      return subject.copyWith(address: value);
    },
  );

  BoundLens<Job, String> get titleOptic => BoundLens(source: this, lens: title);

  BoundLens<Job, Address> get addressOptic =>
      BoundLens(source: this, lens: address);
}

// 字符串扩展
extension StringOptics on String {
  BoundLens<String, String> get indefiniteArticle => BoundLens(
        source: this,
        lens: Lens(
          getter: (source) {
            if (source.isEmpty) {
              return source;
            }

            final vowels = ['a', 'e', 'i', 'o', 'u'];

            for (final vowel in vowels) {
              if (source.toLowerCase().startsWith(vowel)) {
                return 'an';
              }
            }

            return 'a';
          },
          setter: (source, value) => value,
        ),
      );
}

// 无用的类
class Nullable {
  const Nullable();
  static const instance = Nullable();
}

更多关于Flutter光学处理插件optics的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter光学处理插件optics的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


optics 是一个用于 Flutter 的光学处理插件,允许开发者在 Flutter 应用中处理图像、视频等光学数据。它可以用于图像处理、滤镜应用、颜色校正、图像增强等场景。以下是如何在 Flutter 项目中使用 optics 插件的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 optics 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  optics: ^0.1.0  # 请根据实际版本号进行替换

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在 Dart 文件中导入 optics 插件:

import 'package:optics/optics.dart';

3. 使用 optics 进行图像处理

optics 插件提供了一系列功能来处理图像。以下是一些常见的用法示例:

3.1 应用滤镜

import 'package:flutter/material.dart';
import 'package:optics/optics.dart';
import 'dart:ui' as ui;

class ImageFilterExample extends StatefulWidget {
  [@override](/user/override)
  _ImageFilterExampleState createState() => _ImageFilterExampleState();
}

class _ImageFilterExampleState extends State<ImageFilterExample> {
  ui.Image? _image;

  [@override](/user/override)
  void initState() {
    super.initState();
    _loadImage();
  }

  Future<void> _loadImage() async {
    final imageBytes = await rootBundle.load('assets/your_image.png');
    final image = await decodeImageFromList(imageBytes.buffer.asUint8List());
    final filteredImage = await Optics.applyFilter(image, OpticsFilter.grayscale);
    setState(() {
      _image = filteredImage;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Filter Example'),
      ),
      body: Center(
        child: _image != null
            ? RawImage(image: _image)
            : CircularProgressIndicator(),
      ),
    );
  }
}

3.2 调整亮度

final adjustedImage = await Optics.adjustBrightness(image, 0.5);

3.3 调整对比度

final adjustedImage = await Optics.adjustContrast(image, 1.5);

3.4 应用模糊效果

final blurredImage = await Optics.applyBlur(image, 10.0);

4. 处理视频

optics 也可以用于处理视频帧。例如,你可以从视频中提取帧并应用滤镜:

import 'package:video_player/video_player.dart';

class VideoFilterExample extends StatefulWidget {
  [@override](/user/override)
  _VideoFilterExampleState createState() => _VideoFilterExampleState();
}

class _VideoFilterExampleState extends State<VideoFilterExample> {
  late VideoPlayerController _controller;
  ui.Image? _currentFrame;

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller = VideoPlayerController.asset('assets/your_video.mp4')
      ..initialize().then((_) {
        setState(() {});
        _processFrame();
      });
  }

  void _processFrame() async {
    final frame = await _controller.videoPlayerController!.videoPlayer!.getVideoFrame();
    final filteredFrame = await Optics.applyFilter(frame, OpticsFilter.sepia);
    setState(() {
      _currentFrame = filteredFrame;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video Filter Example'),
      ),
      body: Center(
        child: _currentFrame != null
            ? RawImage(image: _currentFrame)
            : CircularProgressIndicator(),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}
回到顶部