Flutter 插件signature签字使用

Pub插件signature

使用 按官方教程使用

官方使用为竖屏模式,我们大多数需要为横屏模式所以我们需要旋转canvas画布,但旋转画布后宽高不适应,因此我们需要旋转屏幕
竖屏模式
1.旋转屏幕代码:需写在生命周期中

@override
  void initState() {
    super.initState();
    _controller.addListener(() => print('Value changed'));
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeLeft, //全屏时旋转方向,左边
    ]);
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp, // 结束生命周期旋转回竖屏
    ]);
  }

横屏模式

2.签字后得到的图片路径格式为Uint8List格式,目前我只能转为base64格式,有哪位大佬能转为png或jpg格式路径望指教

final Uint8List data = await _controller.toPngBytes();
final imageEncoded = base64.encode(data); //转换为base64格式
// Uint8List bytes = Base64Decoder().convert(imageEncoded); // 转换为uint8List   byte格式

完整实例

import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:signature/signature.dart';

class SignturePage extends StatefulWidget {
  SignturePage({Key key}) : super(key: key);

  @override
  _SignturePageState createState() => _SignturePageState();
}

class _SignturePageState extends State<SignturePage> {
  final SignatureController _controller = SignatureController(
    penStrokeWidth: 1,
    penColor: Colors.black,
    exportBackgroundColor: Colors.white,
    onDrawStart: () => print('onDrawStart called!'),
    onDrawEnd: () => print('onDrawEnd called!'),
  );

  @override
  void initState() {
    super.initState();
    _controller.addListener(() => print('Value changed'));
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeLeft, //全屏时旋转方向,左边
    ]);
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
    ]);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false, // 去掉debug图标
      home: Builder(
        builder: (BuildContext context) => Scaffold(
          body: ListView(
            children: <Widget>[
              //SIGNATURE CANVAS
              Signature(
                controller: _controller,
                height: 300,
                backgroundColor: Colors.white,
              ),
              //OK AND CLEAR BUTTONS
              Container(
                decoration: const BoxDecoration(color: Colors.black),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  mainAxisSize: MainAxisSize.max,
                  children: <Widget>[
                    //SHOW EXPORTED IMAGE IN NEW ROUTE
                    IconButton(
                      icon: const Icon(Icons.check),
                      color: Colors.blue,
                      onPressed: () async {
                        if (_controller.isNotEmpty) {
                          final Uint8List data = await _controller.toPngBytes();
                          final imageEncoded =
                              base64.encode(data); //转换为base64格式
                          // Uint8List bytes = Base64Decoder()
                          //     .convert(imageEncoded); // 转换为uint8List   byte格式
                          if (data != null) {
                            await Navigator.of(context).push(
                              MaterialPageRoute<void>(
                                builder: (BuildContext context) {
                                  return Scaffold(
                                    appBar: AppBar(),
                                    body: Center(
                                      child: Container(
                                        color: Colors.grey[300],
                                        child: Image.memory(data),
                                      ),
                                    ),
                                  );
                                },
                              ),
                            );
                          }
                        }
                      },
                    ),
                    //CLEAR CANVAS
                    IconButton(
                      icon: const Icon(Icons.clear),
                      color: Colors.blue,
                      onPressed: () {
                        setState(() => _controller.clear());
                      },
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注:如本文对你有所帮助,还望三连,谢谢。如有更佳教程,还望大佬指教。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
flutter_map是一个用于在Flutter应用程序中集成地图的插件[^2]。下面是一个使用flutter_map插件的示例: 首先,您需要在`pubspec.yaml`文件中添加flutter_map的依赖项: ```yaml dependencies: flutter_map: ^0.3.0 ``` 然后,运行`flutter packages get`命令来获取依赖项。 接下来,您可以在Flutter应用程序中使用flutter_map插件。以下是一个简单的示例,展示如何在地图上显示一个标记点: ```dart import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong/latlong.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Map Demo', home: Scaffold( appBar: AppBar( title: Text('Flutter Map Demo'), ), body: FlutterMap( options: MapOptions( center: LatLng(51.5, -0.09), zoom: 13.0, ), layers: [ TileLayerOptions( urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", subdomains: ['a', 'b', 'c'], ), MarkerLayerOptions( markers: [ Marker( width: 80.0, height: 80.0, point: LatLng(51.5, -0.09), builder: (ctx) => Container( child: FlutterLogo(), ), ), ], ), ], ), ), ); } } ``` 在上面的示例中,我们创建了一个Flutter应用程序,并在地图上显示了一个标记点。我们使用了`FlutterMap`小部件来显示地图,并使用`MapOptions`来设置地图的中心点和缩放级别。我们还使用了`TileLayerOptions`来指定地图瓦片的URL模板,以及`MarkerLayerOptions`来添加标记点。 请注意,为了使用flutter_map插件,您还需要在`pubspec.yaml`文件中添加`latlong`库的依赖项: ```yaml dependencies: latlong: ^0.6.1 ``` 这是一个简单的示例,您可以根据自己的需求进行更多的定制和功能扩展。希望对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值