Flutter望远镜功能插件telescope的使用

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

Flutter望远镜功能插件telescope的使用

Telescope 是一个易于使用的状态管理器,基于观察者设计模式。它支持所有平台,并且具有丰富的特性,如直接绑定到Flutter的状态fulWidget、保存状态到磁盘等。

安装和导入

安装

首先,通过以下命令安装 telescope 插件:

flutter pub add telescope

导入

在你的 Dart 文件中导入 telescope 包:

import 'package:telescope/telescope.dart';

如何使用

使用 Telescope 分为三个步骤:

1. 创建一个 Telescope 实例

var textValue = Telescope("default value");

2. 在 Widget 中监听(watch)

将下面的代码放在 Widget 的 build 函数中:

@override
Widget build(BuildContext context) {
  return Material(
      child: SafeArea(
          child: Container(
            child: Column(children: [
              // watch like this ('this' is State that will automatically rebuild on data change)
              Text(textValue.watch(this)), 
              Text(textValue.watch(this)),
              Text(textValue.watch(this).length.toString()),
            ],),
          )
      )
  );
}

注意:你可以在多个 Widget 中监听同一个 Telescope 实例。

3. 更新值

你可以从任何地方更新 Telescope 的值:

onTap: (){
  textValue.value += "a";
}

当值更新时,Widget 会自动重建,无需调用 setState()

其他功能

依赖关系

Telescopes 可以依赖于其他 Telescopes:

var height = Telescope(186);
var weight = Telescope(72);

var bmi = Telescope.dependsOn([height, weight], () {
  return weight.value / ((height.value/100) * (height.value/100));
});

var showingText  = Telescope.dependsOn([bmi], () {
  return "weight is ${weight.value} and height is ${height.value} so bmi will be ${bmi.value.toString().substring(0,5)}";
});

异步方式

var bmi = Telescope.dependsOnAsync(0, [height, weight], () async {
  return await calculateBMI(height.value, weight.value);
});

缓存

var bmi = Telescope.dependsOnAsync(0, [height, weight], () async {
   return await calculateBMI(height.value, weight.value);
}, enableCaching: true);

你还可以设置缓存过期时间 cacheExpireTime

防抖动

var bmi = Telescope.dependsOnAsync(0, [height, weight], () async {
   return await calculateBMI(height.value, weight.value);
}, debounceTime: Duration(milliseconds: 500));

加载状态

var isCalculatingBMI = Telescope<bool>(false);
var bmi = Telescope.dependsOnAsync(0, [height, weight], () async {
   return await calculateBMI(height.value, weight.value);
}, isCalculating: isCalculatingBMI);

保存到磁盘

var height = Telescope.saveOnDiskForBuiltInType(187, "bmi_height_input");

这样即使用户关闭并重新打开应用,Telescope 也会加载上次保存的值。

TelescopeList

Telescope 对列表的支持:

var items = TelescopeList(["ab", "abb", "bc", "bcc" , "c"]);

保存非内置类型的值到磁盘

你需要实现 OnDiskSaveAbility 接口:

class Human {
   int height;
   int weight;
   Human(this.height,this.weight);

   @override
   int get hashCode => height*weight;
}

class HumanOnDiskAbility implements OnDiskSaveAbility<Human> {
   @override
   Human parseOnDiskString(String data) {
      var sp = data.split(":");
      return Human(int.parse(sp[0]), int.parse(sp[1]));
   }

   @override
   String toOnDiskString(Human instance) => "${instance.height}:${instance.weight}";
}

var human = Telescope.saveOnDiskForNonBuiltInType(
        Human(187, 72),
        "human_for_bmi",
        HumanOnDiskAbility()
);

示例 Demo

以下是一个完整的示例 Demo:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  var textValue = Telescope("Hello");

  void _updateText() {
    textValue.value += "!";
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Telescope Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              textValue.watch(this),
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _updateText,
              child: Text('Update Text'),
            ),
          ],
        ),
      ),
    );
  }
}

这个示例展示了如何创建一个 Telescope 实例、在 Widget 中监听它的值并在按钮点击时更新其值。希望这个示例能帮助你更好地理解和使用 Telescope 插件。


更多关于Flutter望远镜功能插件telescope的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter望远镜功能插件telescope的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,虽然没有一个官方的、广泛认知的名为“telescope”的插件专门用于望远镜功能,但我们可以假设你想要实现一个具有放大和望远功能的界面,类似于使用摄像头进行远距离观察的效果。这通常涉及摄像头的使用和图像放大处理。

下面是一个基本的Flutter代码案例,它使用camera插件来获取实时摄像头画面,并使用pinch_zoom_image插件来实现图像的放大和缩小功能。请注意,这个示例不是直接实现望远镜的复杂光学计算,而是提供了一个基本的图像放大和缩小界面。

首先,你需要在pubspec.yaml文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  camera: ^0.10.0+1  # 请检查最新版本号
  pinch_zoom_image: ^2.0.0  # 请检查最新版本号

然后,运行flutter pub get来安装这些依赖。

接下来是主要的Dart代码,用于实现摄像头画面获取和图像放大缩小功能:

import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'package:pinch_zoom_image/pinch_zoom_image.dart';

List<CameraDescription> cameras;

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  cameras = await availableCameras();
  runApp(MyApp());
}

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

class CameraScreen extends StatefulWidget {
  @override
  _CameraScreenState createState() => _CameraScreenState();
}

class _CameraScreenState extends State<CameraScreen> {
  CameraController? controller;
  late final ValueNotifier<double> _scaleNotifier = ValueNotifier(1.0);
  late final ValueNotifier<Offset> _positionNotifier = ValueNotifier(Offset.zero);

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

  Future<void> startCamera() async {
    if (!cameras.isEmpty) {
      controller = new CameraController(
        cameras[0],
        ResolutionPreset.high,
        enableAudio: false,
      );

      controller!.initialize().then((_) {
        if (mounted) {
          setState(() {});
        }
        controller!.startImageStream((CameraImage image) async {
          // 在这里,你可以处理图像数据,例如将其转换为Bitmap
          // 但为了简单起见,我们在这里省略了这个步骤
          // 并直接使用一个静态图像作为示例
        });
      });
    }
  }

  @override
  void dispose() {
    controller?.dispose();
    _scaleNotifier.dispose();
    _positionNotifier.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Telescope Demo'),
      ),
      body: controller?.value.isInitialized ?? false
          ? Center(
              child: PinchZoomImage(
                image: NetworkImage('https://example.com/path/to/your/image.jpg'), // 这里使用网络图片作为示例
                scale: _scaleNotifier.value,
                position: _positionNotifier.value,
                onScaleUpdate: (scale) {
                  _scaleNotifier.value = scale;
                },
                onPositionUpdate: (position) {
                  _positionNotifier.value = position;
                },
                minScale: 1.0,
                maxScale: 5.0, // 根据需要调整最大放大倍数
                zoomDuration: const Duration(milliseconds: 200),
                backgroundColor: Colors.black,
              ),
            )
          : Container(
              color: Colors.black,
              child: Center(
                child: CircularProgressIndicator(),
              ),
            ),
    );
  }
}

注意

  1. 在上面的代码中,我们使用了camera插件来获取摄像头画面,但由于实时处理摄像头图像数据可能比较复杂,并且不是本示例的重点,因此我们直接使用了一个网络图片作为示例。在实际应用中,你可能需要将摄像头捕捉到的图像数据转换为可以显示的格式(如Bitmap),并将其传递给PinchZoomImage组件。

  2. PinchZoomImage组件用于实现图像的放大和缩小功能。你可以根据需要调整minScalemaxScale属性来控制放大和缩小的范围。

  3. 在实际应用中,你可能需要处理摄像头权限请求、摄像头切换等功能,这些在上面的示例中都没有包含。

  4. 确保在AndroidManifest.xmlInfo.plist文件中正确配置摄像头权限。

  5. 由于插件版本可能会更新,请确保使用与你的Flutter环境兼容的插件版本。

回到顶部