Sunmi V2 with Flutter

Viewed 4604

How can I use Flutter to print in Sunmi V2?

I am trying to use this package: https://pub.dev/packages/sunmi But there is no clear explanation of how to use it

2 Answers

There is a new flutter plugin for Sunmi printers: flutter_sunmi_printer

It can print texts with styles (bold, underline, align, font size), tables (using Bootstrap-like grid system), images etc.

import 'package:flutter_sunmi_printer/flutter_sunmi_printer.dart';

// Text with styles
SunmiPrinter.text('left');
SunmiPrinter.text(
    'center',
    styles: SunmiStyles(bold: true, underline: true, align: SunmiAlign.center),
);
SunmiPrinter.text(
    'right',
    styles: SunmiStyles(bold: true, underline: true, align: SunmiAlign.right),
);

// Table
SunmiPrinter.row(
    cols: [
        SunmiCol(text: 'col1', width: 4),
        SunmiCol(text: 'col2', width: 4, align: SunmiAlign.center),
        SunmiCol(text: 'col3', width: 4, align: SunmiAlign.right),
    ],
);

// Image
ByteData bytes = await rootBundle.load('assets/rabbit_black.jpg');
final buffer = bytes.buffer;
final imgData = base64.encode(Uint8List.view(buffer));
SunmiPrinter.image(imgData);

You can see github https://github.com/irpankusuma/SUNMI_AIDL_PRINTER
Full example code https://github.com/irpankusuma/SUNMI_AIDL_PRINTER/tree/master/example

In pubspec.yaml manually add

assets:
 - assets/images/

from widget/config.dart add the following png and jpg to assets/images

const String defaultLogoImage = "assets/images/logo.png";
const String defaultPrintLogoImage = "assets/images/print-logo.png";
const String defaultErrorImage = "assets/images/error_404.jpg";

Print Page

import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:sunmi_aidl_print_example/blocs/blocs.dart';
import 'package:sunmi_aidl_print_example/blocs/printing_bloc.dart';
import 'package:sunmi_aidl_print_example/config.dart' as config;
import 'package:flutter/material.dart';
import 'package:sunmi_aidl_print/models.dart';
import 'package:sunmi_aidl_print/sunmi_aidl_print.dart';
import 'package:sunmi_aidl_print_example/models/models.dart';
import 'package:sunmi_aidl_print_example/common/common.dart';


class PrintingPage extends StatefulWidget {
  @override
  State<PrintingPage> createState() => PrintingPageState();
}

class PrintingPageState extends State<PrintingPage>{
  List<SunmiPrinter> array = <SunmiPrinter>[];
  List<MenuService> menus = <MenuService>[];
  Uint8List bytes;

  @override
  void initState() {
    super.initState();
    _getBytesImage();
    SunmiAidlPrint.bindPrinter();
  }

  @override
  void dispose() {
    super.dispose();
    SunmiAidlPrint.unbindPrinter();
  }

  void _getBytesImage() async{
    ByteData getBytes = await rootBundle.load(config.defaultPrintLogoImage);
    Uint8List image = getBytes.buffer.asUint8List();
    setState(() => bytes = image);
  }

  void _generateMenu() {
    menus.add(new MenuService(
      name:'TEXT',
      icons: Icon(Icons.text_fields),
      onTap: () => null
    ));
  }

  void _openAlert({ String error}){
    showDialog(
      context: context,
      builder: (context) => new AlertDialog(
        title: new Text('Alert'),
        content: new Text(error),
      )
    );
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('PRINT EXAMPLE'),
      ),
      body: new Container(
        child: BlocListener<PrintingBloc,PrintingState>(
          listener: (context,state){
            if(state is ErrorPrinting){ _openAlert(error:state.error); }
          },
          child: BlocBuilder<PrintingBloc,PrintingState>(
            builder: (context,state){
              if(state is LoadingPrinting){ return new LoadingIndicator(); }
              if(state is InitialPrinting){ 
                return new Container(
                  child: new MenuServiceState(items:menus,),
                );
              }
              if(state is LoadedPrinting){
                return new Container(
                  child: new MenuServiceState(items:menus,),
                );
              }

              new Container();
            },
          ),
        ),
      ),
    );
  }
}


class MenuServiceState extends StatelessWidget {
  final List<MenuService> items;
  final int crossAxis;
  MenuServiceState({ this.items, this.crossAxis=3 });

  @override
  Widget build(BuildContext context) {
    return new Container(
      margin: EdgeInsets.only(top:8.0,bottom:8.0),
      child: new GridView.builder(
        shrinkWrap: true,
        gridDelegate:new SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount:crossAxis),
        physics: ClampingScrollPhysics(),
        itemCount: items.length,
        itemBuilder: (context,i) => new GestureDetector(
          onTap: () => items[i].onTap,
          child: new Container(
            alignment: Alignment.center,
            child: new Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                new Container(
                  decoration: new BoxDecoration(
                    border: Border.all(color:Colors.grey,width:1.0),
                    borderRadius: new BorderRadius.all(new Radius.circular(20.0))
                  ),
                  padding: EdgeInsets.all(12.0),
                  child: items[i].icons,
                ),
                new Padding(padding: EdgeInsets.only(top:6.0),),new Text("${items[i].name}")
              ],
            ),
          ),
        ),
      ),
    );
  }
}
Related