This commit is contained in:
歪脖子 2023-10-24 15:20:03 +08:00
parent 3731141227
commit 7c436bd381
18 changed files with 1493 additions and 73 deletions

View File

@ -10,7 +10,7 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:jc_printer/jc_printer.dart';
// import 'package:jc_printer/jc_printer.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();

View File

@ -28,6 +28,8 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe
flutter_ios_podfile_setup
target 'Runner' do
use_modular_headers!
use_frameworks!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths

View File

@ -4,11 +4,23 @@ PODS:
- Flutter
- jc_printer (0.0.1):
- Flutter
- Protobuf (3.24.4)
- reactive_ble_mobile (0.0.1):
- Flutter
- Protobuf (~> 3.5)
- SwiftProtobuf (~> 1.0)
- SwiftProtobuf (1.24.0)
DEPENDENCIES:
- Flutter (from `Flutter`)
- integration_test (from `.symlinks/plugins/integration_test/ios`)
- jc_printer (from `.symlinks/plugins/jc_printer/ios`)
- reactive_ble_mobile (from `.symlinks/plugins/reactive_ble_mobile/ios`)
SPEC REPOS:
trunk:
- Protobuf
- SwiftProtobuf
EXTERNAL SOURCES:
Flutter:
@ -17,12 +29,17 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/integration_test/ios"
jc_printer:
:path: ".symlinks/plugins/jc_printer/ios"
reactive_ble_mobile:
:path: ".symlinks/plugins/reactive_ble_mobile/ios"
SPEC CHECKSUMS:
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
integration_test: 13825b8a9334a850581300559b8839134b124670
jc_printer: 98d27e989a3129f784669a21dd5883eec26ba102
Protobuf: 351e9022fe13a6e2af00e9aefc22077cb88520f8
reactive_ble_mobile: 9ce6723d37ccf701dbffd202d487f23f5de03b4c
SwiftProtobuf: bcfd2bc231cf9ae552cdc7c4e877bd3b41fe57b1
PODFILE CHECKSUM: 02caaa843f6501172c0d470d80e72f61175c8b93
PODFILE CHECKSUM: b93a2ec14f1c13812166ff9c14f4914d6c6e5d23
COCOAPODS: 1.13.0

View File

@ -7,16 +7,18 @@
objects = {
/* Begin PBXBuildFile section */
10D5D5F3CC5D3E87F4AAF20E /* libPods-RunnerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A8187878D1E2CD429B7D166B /* libPods-RunnerTests.a */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
17F38D4D2AE51FBB00487369 /* JCSDKFont.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 17F38D4C2AE51FBB00487369 /* JCSDKFont.bundle */; };
17F38D4F2AE51FD700487369 /* SourceHanSans-Regular.ttc in Resources */ = {isa = PBXBuildFile; fileRef = 17F38D4E2AE51FD700487369 /* SourceHanSans-Regular.ttc */; };
331C80F4294D02FB00263BE5 /* RunnerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 331C80F3294D02FB00263BE5 /* RunnerTests.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
729636EF36A53C120B8F72EE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC47687E2219A68A71BCD69C /* Pods_RunnerTests.framework */; };
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
D72C0DE9E160819031C5E3E4 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F40EEDC1B3DAB75AD1218FEF /* libPods-Runner.a */; };
C14833107E81995AF9AE3F8F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD3314FB6F05D6F16AC71377 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -45,6 +47,8 @@
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
17F38D4C2AE51FBB00487369 /* JCSDKFont.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = JCSDKFont.bundle; sourceTree = "<group>"; };
17F38D4E2AE51FD700487369 /* SourceHanSans-Regular.ttc */ = {isa = PBXFileReference; lastKnownFileType = file; name = "SourceHanSans-Regular.ttc"; path = "Runner/JCSDKFont.bundle/SourceHanSans-Regular.ttc"; sourceTree = "<group>"; };
331C80F1294D02FB00263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
331C80F3294D02FB00263BE5 /* RunnerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RunnerTests.m; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
@ -62,10 +66,10 @@
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
A47E728957F5618558E7C7DF /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
A8187878D1E2CD429B7D166B /* libPods-RunnerTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RunnerTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
AC93C0AD3746E8534100DB47 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
B35671E4ABF84AEDC8C673D9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
F40EEDC1B3DAB75AD1218FEF /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; };
CD3314FB6F05D6F16AC71377 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
EC47687E2219A68A71BCD69C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
FEEEE64755D6E7811332A20C /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
@ -74,7 +78,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
10D5D5F3CC5D3E87F4AAF20E /* libPods-RunnerTests.a in Frameworks */,
729636EF36A53C120B8F72EE /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -82,7 +86,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
D72C0DE9E160819031C5E3E4 /* libPods-Runner.a in Frameworks */,
C14833107E81995AF9AE3F8F /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -113,8 +117,8 @@
5B206BD512BCA9AC88115CF7 /* Frameworks */ = {
isa = PBXGroup;
children = (
F40EEDC1B3DAB75AD1218FEF /* libPods-Runner.a */,
A8187878D1E2CD429B7D166B /* libPods-RunnerTests.a */,
CD3314FB6F05D6F16AC71377 /* Pods_Runner.framework */,
EC47687E2219A68A71BCD69C /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
@ -133,6 +137,7 @@
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
17F38D4E2AE51FD700487369 /* SourceHanSans-Regular.ttc */,
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
331C80F2294D02FB00263BE5 /* RunnerTests */,
@ -154,6 +159,7 @@
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
17F38D4C2AE51FBB00487369 /* JCSDKFont.bundle */,
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,
97C146FA1CF9000F007C117D /* Main.storyboard */,
@ -208,7 +214,7 @@
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
20F8517985BB5619A77F396B /* [CP] Embed Pods Frameworks */,
E66D16C1F41008EA24F48C2D /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@ -271,6 +277,8 @@
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
17F38D4D2AE51FBB00487369 /* JCSDKFont.bundle in Resources */,
17F38D4F2AE51FD700487369 /* SourceHanSans-Regular.ttc in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
@ -301,23 +309,6 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
20F8517985BB5619A77F396B /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@ -371,6 +362,23 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
E66D16C1F41008EA24F48C2D /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */

Binary file not shown.

View File

@ -0,0 +1,369 @@
{
"0020-007F": {
"description":"Basic_Latin",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"00A0-00FF":{
"description":"Latin-1_Supplement",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"0100-017F":{
"description":"Latin Extended-A",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"0370-03FF": {
"description":"Greek and Coptic",
"fontFile":""
},
"10A0-10FF": {
"description":"Georgian",
"fontFile":"NotoSansGeorgian-Regular.otf"
},
"0400-04FF": {
"description":"Cyrillic",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"0500-052F": {
"description":"Cyrillic Supplementary",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"0530-058F": {
"description":"Armenian",
"fontFile":"NotoSansArmenian-Regular.otf"
},
"0590-05FF":{
"description":"Hebrew",
"fontFile":"NotoSansHebrew-Regular.ttf"
},
"0600-06FF":{
"description":"Arabic",
"fontFile":"NotoNaskhArabic-Regular.ttf"
},
"0700-074F":{
"description":"Syriac",
"fontFile":"NotoSansSyriacEstrangela-Regular.ttf"
},
"0780-07BF":{
"description":"Thaana",
"fontFile":"NotoSansThaana-Regular.ttf"
},
"0900-097F":{
"description":"Devanagari",
"fontFile":"NotoSansDevanagari-Regular.otf"
},
"0980-09FF":{
"description":"Bengali",
"fontFile":"NotoSansBengali-Regular.otf"
},
"0A00-0A7F":{
"description":"Gurmukhi",
"fontFile":"NotoSansGurmukhi-Regular.ttf"
},
"0B00-0B7F":{
"description":"Oriya",
"fontFile":"NotoSansOriya-Regular.ttf"
},
"0B80-0BFF":{
"description":"Tamil",
"fontFile":"NotoSansTamil-Regular.otf"
},
"0C00-0C7F":{
"description":"Telugu",
"fontFile":"NotoSansTelugu-Regular.ttf"
},
"0C80-0CFF":{
"description":"Kannada",
"fontFile":"NotoSansKannada-Regular.ttf"
},
"0D00-0D7F":{
"description":"Malayalam",
"fontFile":"NotoSansMalayalam-Regular.otf"
},
"0D80-0DFF":{
"description":"Sinhala",
"fontFile":"NotoSansSinhala-Regular.otf"
},
"0E00-0E7F":{
"description":"Thai",
"fontFile":"NotoSansThai-Regular.ttf"
},
"0E80-0EFF":{
"description":"Lao",
"fontFile":"NotoSansLao-Regular.ttf"
},
"0F00-0FFF":{
"description":"Tibetan",
"fontFile":"NotoSansTibetan-Regular.ttf"
},
"1000-109F":{
"description":"Myanmar",
"fontFile":"NotoSansMyanmar-Regular-ZawDecode.ttf"
},
"10000-1007F":{
"description":"Linear B Syllabary",
"fontFile":"NotoSansLinearB-Regular.ttf"
},
"10080-100FF":{
"description":"Linear B Ideograms",
"fontFile":"NotoSansLinearB-Regular.ttf"
},
"10380-1039F":{
"description":"Ugaritic",
"fontFile":"NotoSansUgaritic-Regular.ttf"
},
"10450-1047F":{
"description":"Shavian",
"fontFile":"NotoSansShavian-Regular.ttf"
},
"10400-1044F":{
"description":"Deseret",
"fontFile":"NotoSansDeseret-Regular.ttf"
},
"10480-104AF":{
"description":"Osmanya",
"fontFile":"NotoSansOsmanya-Regular.ttf"
},
"10800-1083F":{
"description":"Cypriot ",
"fontFile":"NotoSansCypriot-Regular.ttf"
},
"1200-137F":{
"description":"Ethiopic",
"fontFile":"NotoSansEthiopic-Regular.ttf"
},
"13A0-13FF":{
"description":"Cherokee",
"fontFile":"NotoSansCherokee-Regular.ttf"
},
"1400-167F":{
"description":"Unified Canadian Aboriginal Syllabics",
"fontFile":"NotoSansCanadianAboriginal-Regular.ttf"
},
"1680-169F":{
"description":"Ogham",
"fontFile":"NotoSansOgham-Regular.ttf"
},
"16A0-16FF":{
"description":"Runic",
"fontFile":"NotoSansRunic-Regular.ttf"
},
"1700-171F":{
"description":"Tagalog",
"fontFile":"NotoSansTagalog-Regular.ttf"
},
"1720-173F":{
"description":"Hanunoo",
"fontFile":"NotoSansHanunoo-Regular.ttf"
},
"1740-175F":{
"description":"Buhid",
"fontFile":"NotoSansBuhid-Regular.ttf"
},
"1760-177F":{
"description":"Tagbanwa",
"fontFile":"NotoSansTagbanwa-Regular.ttf"
},
"1780-17FF":{
"description":"Khmer",
"fontFile":"NotoSansKhmer-VF.ttf"
},
"1800-18AF":{
"description":"Mongolian",
"fontFile":"NotoSansMongolian-Regular.ttf"
},
"1900-194F":{
"description":"Limbu",
"fontFile":"NotoSansLimbu-Regular.ttf"
},
"1950-197F":{
"description":"Tai Le",
"fontFile":"NotoSansTaiLe-Regular.ttf"
},
"19E0-19FF":{
"description":"Khmer Symbols",
"fontFile":"NotoSansKhmer-VF.ttf"
},
"1D000-1D0FF":{
"description":"Byzantine Musical Symbols",
"fontFile":"NotoSansSymbols-Regular-Subsetted.ttf"
},
"1D300-1D35F@Tai Xuan Jing Symbols":{
"description":"Tai Xuan Jing Symbols",
"fontFile":"NotoSansTaiLe-Regular.ttf"
},
"1E00-1EFF":{
"description":"Latin Extended Additional",
"fontFile":"NotoSansTaiLe-Regular.ttf"
},
"1F00-1FFF":{
"description":"Greek Extended",
"fontFile":"NotoSansSylotiNagri-Regular.ttf"
},
"2000-206F":{
"description":"General Punctuation",
"fontFile":"NotoSansTaiLe-Regular.ttf"
},
"20000-2A6DF":{
"description":"CJK",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"20A0-20CF":{
"description":"Currency Symbols",
"fontFile":"NotoSansSymbols-Regular-Subsetted2.ttf"
},
"20D0-20FF":{
"description":"Combining Diacritical Marks for Symbols",
"fontFile":"NotoSansSymbols-Regular-Subsetted2.ttf"
},
"2100-214F":{
"description":"Letterlike Symbols",
"fontFile":"NotoSansSymbols-Regular-Subsetted.ttf"
},
"2200-22FF":{
"description":"Tai Le",
"fontFile":"NotoSansSymbols-Regular-Subsetted.ttf"
},
"2300-23FF":{
"description":"Miscellaneous Technical",
"fontFile":"NotoSansSymbols-Regular-Subsetted.ttf"
},
"2400-243F":{
"description":"Control Pictures",
"fontFile":"NotoSansTaiLe-Regular.ttf"
},
"2440-245F":{
"description":"Optical Character Recognition",
"fontFile":"NotoSansGujarati-Regular.ttf"
},
"2460-24FF":{
"description":"Enclosed Alphanumerics",
"fontFile":"NotoSansGujarati-Regular.ttf"
},
"2500-257F":{
"description":"Box Drawing",
"fontFile":"NotoSansGujarati-Regular.ttf"
},
"2580-259F":{
"description":"Block Elements",
"fontFile":"NotoSansTaiLe-Regular.ttf"
},
"25A0-25FF":{
"description":"Geometric Shapes",
"fontFile":"NotoSansTaiLe-Regular.ttf"
},
"2600-26FF":{
"description":"Miscellaneous Symbols",
"fontFile":"NotoSansSymbols-Regular-Subsetted.ttf"
},
"2700-27BF":{
"description":"Dingbats",
"fontFile":"NotoSansTaiLe-Regular.ttf"
},
"27C0-27EF":{
"description":"@Miscellaneous Mathematical Symbols-A",
"fontFile":"NotoSansSymbols-Regular-Subsetted.ttf"
},
"27F0-27FF":{
"description":"@Supplemental Arrows-A",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"2800-28FF":{
"description":"Braille Patterns",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"2900-297F":{
"description":"@Supplemental Arrows-B",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"2980-29FF":{
"description":"Miscellaneous Mathematical Symbols-B",
"fontFile":"NotoSansSymbols-Regular-Subsetted2.ttf"
},
"2A00-2AFF":{
"description":"@Supplemental Mathematical Operators",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"2B00-2BFF":{
"description":"@Miscellaneous Symbols and Arrows",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"2E80-2EFF":{
"description":"CJK Radicals Supplement",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"2F800-2FA1F":{
"description":"Tai Le",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"3040-309F":{
"description":"Hiragana",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"30A0-30FF@Katakana":{
"description":"Katakana",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"3100-312F@Bopomofo":{
"description":"Bopomofo",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"3130-318F":{
"description":"Hangul Compatibility Jamo",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"3190-319F":{
"description":"Kanbun",
"fontFile":"NotoSansKannada-Regular.ttf"
},
"31A0-31BF@Bopomofo Extended":{
"description":"Tai Le",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"31F0-31FF":{
"description":"Katakana Phonetic Extensions",
"fontFile":"NotoSansCJK-Regular.ttc"
},"3200-32FF":{
"description":"Enclosed CJK Letters and Months",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"3300-33FF":{
"description":"CJK Compatibility",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"4DC0-4DFF":{
"description":"Yijing Hexagram Symbols",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"4E00-9FFF":{
"description":"CJK Unified Ideographs",
"fontFile":"SourceHanSans-Regular.ttc"
},
"FB00-FB4F":{
"description":"Alphabetic Presentation Forms",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"FB50-FDFF":{
"description":"Arabic Presentation Forms-A",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"FE00-FE0F":{
"description":"Variation Selectors",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"FE20-FE2F":{
"description":"Combining Half Marks",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"FE30-FE4F":{
"description":"CJK Compatibility Forms",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"FE50-FE6F":{
"description":"Small Form Variants",
"fontFile":"NotoSansCJK-Regular.ttc"
},
"FF00-FFEF":{
"description":"Halfwidth and Fullwidth Forms",
"fontFile":"NotoSansCJK-Regular.ttc"
}
}

View File

@ -1,34 +1,237 @@
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:jc_printer/jc_printer.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
Widget build(BuildContext context) {
return const MaterialApp(
home: HomePage(),
);
}
}
class _MyAppState extends State<MyApp> {
final _jcPrinter = JcPrinter();
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final TextEditingController _labelWidthInput = TextEditingController();
final TextEditingController _labelHeightInput = TextEditingController();
final TextEditingController _countInput = TextEditingController();
final TextEditingController _contentInput = TextEditingController();
final _printer = JcPrinter();
ConnectState _connectState = ConnectState.none;
StreamSubscription<ConnectState>? _connectStateSubs;
StreamSubscription<int>? _printingCountSubs;
StreamSubscription<Map<String, String>>? _errorInfoSubs;
DiscoveredDevice? _device;
String get _title {
switch (_connectState) {
case ConnectState.connecting:
return '连接中';
case ConnectState.connected:
return _device?.name ?? '已连接';
case ConnectState.none:
return '未连接';
}
}
@override
void initState() {
_labelWidthInput.text = '40';
_labelHeightInput.text = '30';
_countInput.text = '1';
_contentInput.text = '歪脖子';
_connectStateSubs = _printer.connectStateStream.listen(
_connectStateListener,
);
_printingCountSubs = _printer.printingCountStream.listen(
_printingCountListener,
);
_errorInfoSubs = _printer.errorInfoStream.listen(
_errorInfoListener,
);
super.initState();
_jcPrinter.connect('name');
}
@override
void dispose() {
_labelWidthInput.dispose();
_labelHeightInput.dispose();
_countInput.dispose();
_contentInput.dispose();
_connectStateSubs?.cancel();
_printingCountSubs?.cancel();
_errorInfoSubs?.cancel();
super.dispose();
}
void _connectStateListener(ConnectState state) {
setState(() {
_connectState = state;
});
}
void _printingCountListener(int count) {
print(count);
}
void _errorInfoListener(Map<String, String> error) {
print(error);
}
void _connect() {
_printer.connect(_device!.name);
}
void _startPrint() async {
final labelWidth = double.tryParse(_labelWidthInput.value.text) ?? 0;
final labelHeight = double.tryParse(_labelHeightInput.value.text) ?? 0;
final count = double.tryParse(_countInput.value.text) ?? 0;
final content = _contentInput.value.text.trim();
if (content.isEmpty || count <= 0) return;
_printer.setTotalPrints(3);
_printer.startPrint(data: '', count: 1);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
return Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
title: _connectState == ConnectState.connecting
? const CupertinoActivityIndicator()
: Text(_title),
actions: [
TextButton(
onPressed: () async {
if (_connectState == ConnectState.connected) {
_printer.disconnect();
return;
}
final result = await showDialog<DiscoveredDevice>(
context: context,
builder: (BuildContext context) => _DevicesDialog(
onTap: Navigator.of(context).pop,
),
);
if (result == null) return;
_device = result;
_connect();
},
child: Text(
_connectState == ConnectState.connected ? '断开' : '连接设备',
style: const TextStyle(color: Colors.white),
),
),
],
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(20),
child: Center(
child: Column(
children: [
TextField(
controller: _labelWidthInput,
decoration: const InputDecoration(label: Text('标签宽度')),
),
TextField(
controller: _labelHeightInput,
decoration: const InputDecoration(label: Text('标签高度')),
),
TextField(
controller: _countInput,
decoration: const InputDecoration(label: Text('打印数量')),
),
TextField(
controller: _contentInput,
decoration: const InputDecoration(label: Text('内容')),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _startPrint,
child: const Text('开始打印'),
),
],
),
),
),
);
}
}
class _DevicesDialog extends StatefulWidget {
final void Function(DiscoveredDevice device)? onTap;
const _DevicesDialog({
Key? key,
this.onTap,
}) : super(key: key);
@override
State<_DevicesDialog> createState() => _DevicesDialogState();
}
class _DevicesDialogState extends State<_DevicesDialog> {
final _ble = FlutterReactiveBle();
final List<DiscoveredDevice> _devices = [];
StreamSubscription<DiscoveredDevice>? _scanSubs;
@override
void initState() {
_scanSubs = _ble.scanForDevices(
withServices: [],
).listen(_scanListener);
super.initState();
}
@override
void dispose() {
_scanSubs?.cancel();
super.dispose();
}
void _scanListener(DiscoveredDevice device) {
if (device.name.isEmpty) return;
if (device.connectable != Connectable.available) return;
final index = _devices.indexWhere(
(element) => element.id == device.id,
);
if (index > -1) {
_devices[index] = device;
} else {
_devices.add(device);
}
if (mounted) setState(() {});
}
@override
Widget build(BuildContext context) {
return Dialog(
child: ConstrainedBox(
constraints: const BoxConstraints(maxHeight: 400),
child: ListView.separated(
itemBuilder: (BuildContext context, int index) {
final item = _devices[index];
return ListTile(
title: Text(item.name),
onTap: () => widget.onTap?.call(item),
);
},
itemCount: _devices.length,
separatorBuilder: (_, __) => const Divider(),
),
),
);

View File

@ -65,6 +65,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.1.4"
fixnum:
dependency: transitive
description:
name: fixnum
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
flutter:
dependency: "direct main"
description: flutter
@ -83,6 +91,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.3"
flutter_reactive_ble:
dependency: "direct main"
description:
name: flutter_reactive_ble
sha256: "7a0d245412dc8e1b72ce2adc423808583b42ce824b1be74001ff22c8bb5ada48"
url: "https://pub.dev"
source: hosted
version: "5.2.0"
flutter_test:
dependency: "direct dev"
description: flutter
@ -93,6 +109,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
functional_data:
dependency: transitive
description:
name: functional_data
sha256: aefdec4365452283b2a7cf420a3169654d51d3e9553069a22d76680d7a9d7c3d
url: "https://pub.dev"
source: hosted
version: "1.1.1"
integration_test:
dependency: "direct dev"
description: flutter
@ -169,6 +193,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.2.4"
protobuf:
dependency: transitive
description:
name: protobuf
sha256: "01dd9bd0fa02548bf2ceee13545d4a0ec6046459d847b6b061d8a27237108a08"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
reactive_ble_mobile:
dependency: transitive
description:
name: reactive_ble_mobile
sha256: e4623446d5fd6e641c984892ee1fa7c67499a2bb0971d85a500815e1d05db6fb
url: "https://pub.dev"
source: hosted
version: "5.2.0"
reactive_ble_platform_interface:
dependency: transitive
description:
name: reactive_ble_platform_interface
sha256: "8988d16497886dccc69dca1c3eebce28ae387371f3f948a4f1b03dec9954fb05"
url: "https://pub.dev"
source: hosted
version: "5.2.0"
sky_engine:
dependency: transitive
description: flutter

View File

@ -17,6 +17,7 @@ dependencies:
flutter:
sdk: flutter
flutter_reactive_ble: 5.2.0
jc_printer:
# When depending on this package from a real application you should use:
# jc_printer: ^x.y.z

View File

@ -1,4 +1,7 @@
#import <Flutter/Flutter.h>
@interface JcPrinterPlugin : NSObject<FlutterPlugin>
@interface JcPrinterPlugin : NSObject<FlutterPlugin, FlutterStreamHandler>
@property (nonatomic, strong) FlutterEventSink eventSink;
@end

View File

@ -3,29 +3,189 @@
@implementation JcPrinterPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
FlutterMethodChannel* channel = [FlutterMethodChannel
methodChannelWithName:@"jc_printer"
binaryMessenger:[registrar messenger]];
FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"jc_printer" binaryMessenger:[registrar messenger]];
JcPrinterPlugin* instance = [[JcPrinterPlugin alloc] init];
[registrar addMethodCallDelegate:instance channel:channel];
FlutterEventChannel* eventChannel = [FlutterEventChannel eventChannelWithName:@"printer_stream" binaryMessenger:[registrar messenger]];
[eventChannel setStreamHandler:instance];
}
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
NSLog(@"arguments is :%@", call.arguments);
// NSLog(@"arguments is :%@", call.arguments);
[self printingCount];
[self errorInfo];
if ([@"getPlatformVersion" isEqualToString:call.method]) {
result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
} else if ([@"connect" isEqualToString:call.method]) {
[self connect:call.arguments result:result];
[self connect:call.arguments];
result(nil);
} else if ([@"disconnect" isEqualToString:call.method]) {
[self disconnect];
result(nil);
} else if ([@"setTotalPrints" isEqualToString:call.method]) {
[self setTotalPrints:call.arguments];
result(nil);
} else if ([@"initDrawingBoard" isEqualToString:call.method]) {
[self initDrawingBoard:call.arguments result:result];
} else if ([@"drawLabelImage" isEqualToString:call.method]) {
[self drawLabelImage:call.arguments result:result];
} else if ([@"drawLabelText" isEqualToString:call.method]) {
[self drawLabelText:call.arguments result:result];
} else if ([@"drawLabelBarcode" isEqualToString:call.method]) {
[self drawLabelBarcode:call.arguments result:result];
} else if ([@"getLabelData" isEqualToString:call.method]) {
[self getLabelData:result];
} else if ([@"startJob" isEqualToString:call.method]) {
[self startJob:call.arguments result:result];
} else if ([@"endJob" isEqualToString:call.method]) {
[self endJob:result];
} else if ([@"commit" isEqualToString:call.method]) {
[self commit:call.arguments result:result];
} else {
result(FlutterMethodNotImplemented);
}
}
- (void)connect:(NSString *)name result:(FlutterResult)result {
[JCAPI openPrinter:name completion:^(BOOL isSuccess) {
- (void) disconnect {
[JCAPI closePrinter];
}
- (void) setTotalPrints:(NSString *)args {
NSInteger page = [args integerValue];
[JCAPI setTotalQuantityOfPrints:page];
}
- (void)initDrawingBoard:(NSDictionary *)args result:(FlutterResult)result {
NSNumber *width = args[@"width"];
NSNumber *height = args[@"height"];
NSNumber *horizontalShift = args[@"horizontalShift"];
NSNumber *verticalShift = args[@"verticalShift"];
NSNumber *rotate = args[@"rotate"];
NSString *font = args[@"font"];
[JCAPI initDrawingBoard:width.floatValue withHeight:height.floatValue withHorizontalShift:horizontalShift.floatValue withVerticalShift:verticalShift.floatValue rotate:rotate.intValue font:font];
result(nil);
}
- (void)drawLabelImage:(NSDictionary *)args result:(FlutterResult)result {
NSNumber *x = args[@"x"];
NSNumber *y = args[@"y"];
NSNumber *width = args[@"width"];
NSNumber *height = args[@"height"];
NSNumber *rotate = args[@"rotate"];
NSNumber *type = args[@"type"];
NSNumber *threshold = args[@"threshold"];
NSString *base64 = args[@"base64"];
BOOL isSuccess = [JCAPI DrawLableImage:x.floatValue withY:y.floatValue withWidth:width.floatValue withHeight:height.floatValue withImageData:base64 withRotate:rotate.intValue withImageProcessingType:type.intValue withImageProcessingValue:threshold.floatValue];
result(@(isSuccess));
}
- (void)drawLabelText:(NSDictionary *)args result:(FlutterResult)result {
NSNumber *x = args[@"x"];
NSNumber *y = args[@"y"];
NSNumber *width = args[@"width"];
NSNumber *height = args[@"height"];
NSNumber *fontSize = args[@"fontSize"];
NSNumber *rotate = args[@"rotate"];
NSNumber *textAlignHorizontal = args[@"textAlignHorizontal"];
NSNumber *textAlignVertical = args[@"textAlignVertical"];
NSNumber *lineMode = args[@"lineMode"];
NSNumber *letterSpacing = args[@"letterSpacing"];
NSNumber *lineSpacing = args[@"lineSpacing"];
NSString *content = args[@"content"];
BOOL isSuccess = [JCAPI drawLableText:x.floatValue withY:y.floatValue withWidth:width.floatValue withHeight:height.floatValue withString:content withFontFamily:@"" withFontSize:fontSize.floatValue withRotate:rotate.intValue withTextAlignHorizonral:textAlignHorizontal.intValue withTextAlignVertical:textAlignVertical.intValue withLineMode:lineMode.intValue withLetterSpacing:letterSpacing.floatValue withLineSpacing:lineSpacing.floatValue withFontStyle:@[@0,@0,@0,@0]];
result(@(isSuccess));
}
- (void)drawLabelBarcode:(NSDictionary *)args result:(FlutterResult)result {
NSNumber *x = args[@"x"];
NSNumber *y = args[@"y"];
NSNumber *width = args[@"width"];
NSNumber *height = args[@"height"];
NSNumber *fontSize = args[@"fontSize"];
NSNumber *rotate = args[@"rotate"];
NSNumber *codeType = args[@"codeType"];
NSNumber *textPosition = args[@"textPosition"];
NSNumber *textHeight = args[@"textHeight"];
NSString *text = args[@"text"];
BOOL isSuccess = [JCAPI drawLableBarCode:x.floatValue withY:y.floatValue withWidth:width.floatValue withHeight:height.floatValue withString:text withFontSize:fontSize.floatValue withRotate:rotate.intValue withCodeType:codeType.intValue withTextHeight:textHeight.floatValue withTextPosition:textPosition.intValue];
result(@(isSuccess));
}
- (void)getLabelData:(FlutterResult)result {
NSString *data = [JCAPI GenerateLableJson];
result(data);
}
- (void)startJob:(NSDictionary *)args result:(FlutterResult)result {
NSNumber *blackRules = args[@"blackRules"];
NSNumber *paperStyle = args[@"paperStyle"];
[JCAPI startJob:blackRules.intValue withPaperStyle:paperStyle.intValue withCompletion:^(BOOL isSuccess) {
result(@(isSuccess));
}];
}
- (void)commit:(NSDictionary *)args result:(FlutterResult)result {
NSString *data = args[@"data"];
NSNumber *count = args[@"count"];
[JCAPI commit:data withOnePageNumbers:count.intValue withComplete:^(BOOL isSuccess) {
result(@(isSuccess));
}];
}
- (void)endJob:(FlutterResult)result {
[JCAPI endPrint:^(BOOL isSuccess) {
result(@(isSuccess));
}];
}
#pragma mark - FlutterStreamHandler
- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events {
self.eventSink = events;
return nil;
}
- (FlutterError *)onCancelWithArguments:(id)arguments {
return nil;
}
- (void)connect:(NSString *)name {
[JCAPI openPrinter:name completion:^(BOOL isSuccess) {
NSDictionary *params = @{
@"type": @"connectState",
@"result": @(isSuccess),
};
!self.eventSink ? : self.eventSink(params);
}];
}
-(void)errorInfo {
[JCAPI getPrintingErrorInfo:^(NSString *printInfo) {
NSDictionary *params = @{
@"type": @"errorInfo",
@"result": printInfo,
};
!self.eventSink ? : self.eventSink(params);
}];
}
- (void)printingCount {
[JCAPI getPrintingCountInfo:^(NSDictionary *printDicInfo) {
NSDictionary *params = @{
@"type": @"printingCount",
@"result": printDicInfo,
};
!self.eventSink ? : self.eventSink(params);
}];
}
@end

39
lib/constants.dart Normal file
View File

@ -0,0 +1,39 @@
const Map<String, String> kErrorInfo = {
'1': '盒盖打开',
'2': '缺纸',
'3': '电量不足',
'4': '电池异常',
'5': '手动停止',
'6': '数据错误',
'7': '温度过高',
'8': '出纸异常',
'9': '打印忙碌',
'10': '没有检测到打印头',
'11': '环境温度过低',
'12': '打印头未锁紧',
'13': '未检测到碳带',
'14': '不匹配的碳带',
'15': '用完的碳带',
'16': '不支持的纸张类型',
'17': '设置纸张失败',
'18': '设置打印模式失败',
'19': '设置打印浓度失败',
'20': '写入Rfid失败',
'21': '边距设置错误',
'22': '通讯异常',
'23': '打印机断开',
'24': '画板参数设置错误',
'25': '旋转角度参数错误',
'26': 'json参数错误(PC)',
'27': '出纸异常',
'28': '检查纸张类型',
'29': 'RFID标签进行非RFID模式打印时',
'30': '浓度设置不支持',
'31': '不支持的打印模式',
'32': '标签材质设置失败',
'33': '不支持的标签材质设置',
'34': '打印机异常',
'35': '切刀异常',
'36': '缺纸(T2)',
'37': '打印机异常(T2无法通过指令恢复需要手动按打印机)',
};

View File

@ -1,10 +1,232 @@
import 'dart:async';
// import 'dart:convert';
import 'package:jc_printer/constants.dart';
import 'jc_printer_platform_interface.dart';
enum ConnectState {
///
connecting,
///
connected,
///
none,
}
class JcPrinter {
final _printer = JcPrinterPlatform.instance;
// final _font = 'SourceHanSans-Regular.ttc';
///
/// @param name
Future<bool> connect(String name) async => _printer.connect(name);
late final StreamController<ConnectState> _connectStateBroadcast;
late final StreamController<int> _printingCountBroadcast;
late final StreamController<Map<String, String>> _errorInfoBroadcast;
static final JcPrinter _instance = JcPrinter._internal();
factory JcPrinter() => _instance;
JcPrinter._internal() {
_connectStateBroadcast = StreamController.broadcast();
_printingCountBroadcast = StreamController.broadcast();
_errorInfoBroadcast = StreamController.broadcast();
_printer.printerStream.listen(_listener);
}
Stream<ConnectState> get connectStateStream => _connectStateBroadcast.stream;
Stream<int> get printingCountStream => _printingCountBroadcast.stream;
Stream<Map<String, String>> get errorInfoStream => _errorInfoBroadcast.stream;
void _listener(dynamic event) {
if (event is! Map) return;
if (event['type'] == 'connectState') _connectStateListener(event);
if (event['type'] == 'printingCount') _printingCountListener(event);
if (event['type'] == 'errorInfo') _errorInfoListener(event);
}
void _connectStateListener(dynamic event) {
_connectStateBroadcast.sink.add(
event['result'] == true ? ConnectState.connected : ConnectState.none,
);
}
void _printingCountListener(dynamic event) {
if (event['result'] is! Map) return;
final result = event['result'];
final count = int.tryParse(result['totalCount'].toString()) ?? 0;
_printingCountBroadcast.sink.add(count);
}
void _errorInfoListener(dynamic event) {
final code = event['result'].toString();
final msg = kErrorInfo[code] ?? '';
_errorInfoBroadcast.sink.add({'code': code, 'msg': msg});
}
void connect(String name) {
_connectStateBroadcast.sink.add(ConnectState.connecting);
_printer.connect(name);
}
void disconnect() {
_printer.disconnect();
}
void setTotalPrints(int count) => _printer.setTotalPrints(count);
///
///
/// @param width mm
///
/// @param height mm
///
/// @param font 使
Future<void> initDrawingBoard({
required double width,
required double height,
required String font,
}) async {
return _printer.initDrawingBoard(width: width, height: height, font: font);
}
///
///
/// @param x mm
///
/// @param y mm
///
/// @param width mm
///
/// @param height mm
///
/// @param content
///
/// @param rotate 0/90/180/270
///
/// @param textAlignHorizontal 0 1 2
///
/// @param textAlignVertical 0 1 2
///
/// @param lineMode
/// 1://
/// 2:
/// 6.
///
/// @param letterSpacing
///
/// @param lineSpacing
Future<void> drawLabelText({
required double width,
required double height,
required String content,
required double fontSize,
double x = 0,
double y = 0,
int rotate = 0,
int textAlignHorizontal = 0,
int textAlignVertical = 0,
int lineMode = 1,
double letterSpacing = 0,
double lineSpacing = 0,
}) async {
await _printer.drawLabelText(
x: x,
y: y,
width: width,
height: height,
content: content,
fontSize: fontSize,
rotate: rotate,
textAlignHorizontal: textAlignHorizontal,
textAlignVertical: textAlignVertical,
lineMode: lineMode,
letterSpacing: letterSpacing,
lineSpacing: lineSpacing,
);
}
///
///
/// @param x mm
///
/// @param y mm
///
/// @param width mm
///
/// @param height mm
///
/// @param text
///
/// @param fontSize
///
/// @param rotate 0/90/180/270
///
/// @param textHeight mm
///
/// @param textPosition
/// 0:
/// 1:
/// 2:
///
/// @param codeType
/// 20:CODE128
/// 21:UPC-A
/// 22:UPC-E
/// 23:EAN8
/// 24:EAN13
/// 25:CODE93
/// 26:CODE39
/// 27:CODEBAR
/// 28:ITF25
Future<void> drawLabelBarcode({
required double width,
required double height,
required String text,
required double fontSize,
required double textHeight,
double x = 0,
double y = 0,
int rotate = 0,
int codeType = 20,
int textPosition = 0,
}) async {
await _printer.drawLabelBarcode(
x: x,
y: y,
width: width,
height: height,
text: text,
fontSize: fontSize,
rotate: rotate,
textHeight: textHeight,
codeType: codeType,
textPosition: textPosition,
);
}
///
Future<String> getLabelData() async => _printer.getLabelData();
///
///
/// @param data
///
/// @param count
Future<bool> startPrint({
required String data,
int count = 1,
}) async {
final result = await _printer.startJob(
blackRules: 0,
paperStyle: 1,
);
if (result != true) return false;
return _printer.commit(data: data, count: count);
}
Future<bool> endPrint() async => _printer.endJob();
}

View File

@ -1,24 +1,179 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'jc_printer_platform_interface.dart';
/// An implementation of [JcPrinterPlatform] that uses method channels.
class MethodChannelJcPrinter extends JcPrinterPlatform {
/// The method channel used to interact with the native platform.
@visibleForTesting
final methodChannel = const MethodChannel('jc_printer');
final method = const MethodChannel('jc_printer');
final event = const EventChannel('printer_stream');
@override
Future<String?> getPlatformVersion() async {
final version = await methodChannel.invokeMethod<String>('getPlatformVersion');
return version;
Future<void> connect(String name) async {
return method.invokeMethod<void>('connect', name);
}
@override
Future<bool> connect(String name) async {
final result = await methodChannel.invokeMethod<bool>('connect', name);
print(result);
Future<void> disconnect() async {
return method.invokeMethod<void>('disconnect');
}
@override
Future<void> setTotalPrints(int page) async {
return method.invokeMethod<void>('setTotalPrints', page);
}
@override
Future<void> initDrawingBoard({
required double width,
required double height,
required String font,
double horizontalShift = 0,
double verticalShift = 0,
int rotate = 0,
}) async {
final Map arguments = {
'width': width,
'height': height,
'horizontalShift': horizontalShift,
'verticalShift': verticalShift,
'rotate': rotate,
'font': font,
};
await method.invokeMethod<void>('initDrawingBoard', arguments);
}
@override
Future<bool> drawLabelImage({
required double x,
required double y,
required double width,
required double height,
required String base64,
int rotate = 0,
int type = 1,
double threshold = 127,
}) async {
final Map arguments = {
'x': x,
'y': y,
'w': width,
'h': height,
'base64': base64,
'rotate': rotate,
'type': type,
'threshold': threshold,
};
final result = await method.invokeMethod<bool>(
'drawLabelImage',
arguments,
);
return result ?? false;
}
@override
Future<bool> drawLabelText({
required double x,
required double y,
required double width,
required double height,
required String content,
required double fontSize,
int rotate = 0,
int textAlignHorizontal = 0,
int textAlignVertical = 0,
int lineMode = 1,
double letterSpacing = 0,
double lineSpacing = 0,
}) async {
final Map arguments = {
'x': x,
'y': y,
'width': width,
'height': height,
'content': content,
'fontSize': fontSize,
'rotate': rotate,
'textAlignHorizontal': textAlignHorizontal,
'textAlignVertical': textAlignVertical,
'lineMode': lineMode,
'letterSpacing': letterSpacing,
'lineSpacing': lineSpacing,
};
final result = await method.invokeMethod<bool>('drawLabelText', arguments);
return result ?? false;
}
@override
Future<bool> drawLabelBarcode({
required double x,
required double y,
required double width,
required double height,
required String text,
required double textHeight,
required double fontSize,
int rotate = 0,
int codeType = 20,
int textPosition = 0,
}) async {
final Map arguments = {
'x': x,
'y': y,
'width': width,
'height': height,
'text': text,
'fontSize': fontSize,
'rotate': rotate,
'textHeight': textHeight,
'codeType': codeType,
'textPosition': textPosition,
};
final result = await method.invokeMethod<bool>(
'drawLabelBarcode',
arguments,
);
return result ?? false;
}
@override
Future<String> getLabelData() async {
final result = await method.invokeMethod<String>('getLabelData');
return result ?? '';
}
@override
Future<bool> startJob({
required int blackRules,
required int paperStyle,
}) async {
final Map arguments = {
'blackRules': blackRules,
'paperStyle': paperStyle,
};
final result = await method.invokeMethod<bool>('startJob', arguments);
return result ?? false;
}
@override
Future<bool> endJob() async {
final result = await method.invokeMethod<bool>('endJob');
return result ?? false;
}
@override
Future<bool> commit({
required String data,
int count = 1,
}) async {
final Map arguments = {
'data': data,
'count': count,
};
final result = await method.invokeMethod<bool>(
'commit',
arguments,
);
return result ?? false;
}
@override
Stream get printerStream => event.receiveBroadcastStream();
}

View File

@ -23,11 +23,204 @@ abstract class JcPrinterPlatform extends PlatformInterface {
_instance = instance;
}
Future<String?> getPlatformVersion() {
throw UnimplementedError('platformVersion() has not been implemented.');
}
Future<bool> connect(String name) async {
///
///
/// @param name
Future<void> connect(String name) async {
throw UnimplementedError('connect() has not been implemented.');
}
///
Future<void> disconnect() async {
throw UnimplementedError('disconnect() has not been implemented.');
}
///
Future<void> setTotalPrints(int page) async {
throw UnimplementedError('setTotalPrints() has not been implemented.');
}
///
///
/// @param width mm
///
/// @param height mm
///
/// @param horizontalShift mm
///
/// @param verticalShift mm
///
/// @param rotate 0/90/180/270
///
/// @param font 使
Future<void> initDrawingBoard({
required double width,
required double height,
required String font,
double horizontalShift = 0,
double verticalShift = 0,
int rotate = 0,
}) async {
throw UnimplementedError('initDrawingBoard() has not been implemented.');
}
///
///
/// @param x mm
///
/// @param y mm
///
/// @param width mm
///
/// @param height mm
///
/// @param base64 base64数据
///
/// @param rotate 0/90/180/270
///
/// @param type 1
///
/// @param threshold 127
Future<bool> drawLabelImage({
required double x,
required double y,
required double width,
required double height,
required String base64,
int rotate = 0,
int type = 1,
double threshold = 127,
}) async {
throw UnimplementedError('drawLabelImage() has not been implemented.');
}
///
///
/// @param x mm
///
/// @param y mm
///
/// @param width mm
///
/// @param height mm
///
/// @param content
///
/// @param rotate 0/90/180/270
///
/// @param textAlignHorizontal 0 1 2
///
/// @param textAlignVertical 0 1 2
///
/// @param lineMode
/// 1://
/// 2:
/// 6.
///
/// @param letterSpacing
///
/// @param lineSpacing
Future<bool> drawLabelText({
required double x,
required double y,
required double width,
required double height,
required String content,
required double fontSize,
int rotate = 0,
int textAlignHorizontal = 0,
int textAlignVertical = 0,
int lineMode = 1,
double letterSpacing = 0,
double lineSpacing = 0,
}) async {
throw UnimplementedError('drawLabelText() has not been implemented.');
}
///
///
/// @param x mm
///
/// @param y mm
///
/// @param width mm
///
/// @param height mm
///
/// @param text
///
/// @param fontSize
///
/// @param rotate 0/90/180/270
///
/// @param textHeight mm
///
/// @param textPosition
/// 0:
/// 1:
/// 2:
///
/// @param codeType
/// 20:CODE128
/// 21:UPC-A
/// 22:UPC-E
/// 23:EAN8
/// 24:EAN13
/// 25:CODE93
/// 26:CODE39
/// 27:CODEBAR
/// 28:ITF25
Future<bool> drawLabelBarcode({
required double x,
required double y,
required double width,
required double height,
required String text,
required double textHeight,
required double fontSize,
int rotate = 0,
int codeType = 20,
int textPosition = 0,
}) {
throw UnimplementedError('drawLabelBarcode() has not been implemented.');
}
///
Future<String> getLabelData() async {
throw UnimplementedError('getLabelData() has not been implemented.');
}
///
///
/// @param blackRules
///
/// @param paperStyle
Future<bool> startJob({
required int blackRules,
required int paperStyle,
}) async {
throw UnimplementedError('startJob() has not been implemented.');
}
///
Future<bool> endJob() async {
throw UnimplementedError('endJob() has not been implemented.');
}
///
///
/// @param data
///
/// @param count
Future<bool> commit({
required String data,
int count = 1,
}) async {
throw UnimplementedError('commit() has not been implemented.');
}
///
Stream<dynamic> get printerStream {
throw UnimplementedError('printerStream has not been implemented.');
}
}

View File

@ -1,11 +1,11 @@
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jc_printer/jc_printer_method_channel.dart';
// import 'package:jc_printer/jc_printer_method_channel.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
MethodChannelJcPrinter platform = MethodChannelJcPrinter();
// MethodChannelJcPrinter platform = MethodChannelJcPrinter();
const MethodChannel channel = MethodChannel('jc_printer');
setUp(() {
@ -22,6 +22,6 @@ void main() {
});
test('getPlatformVersion', () async {
expect(await platform.getPlatformVersion(), '42');
// expect(await platform.getPlatformVersion(), '42');
});
}

View File

@ -1,5 +1,5 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:jc_printer/jc_printer.dart';
// import 'package:jc_printer/jc_printer.dart';
import 'package:jc_printer/jc_printer_platform_interface.dart';
import 'package:jc_printer/jc_printer_method_channel.dart';
// import 'package:plugin_platform_interface/plugin_platform_interface.dart';
@ -20,7 +20,7 @@ void main() {
});
test('getPlatformVersion', () async {
JcPrinter jcPrinterPlugin = JcPrinter();
// JcPrinter jcPrinterPlugin = JcPrinter();
// MockJcPrinterPlatform fakePlatform = MockJcPrinterPlatform();
// JcPrinterPlatform.instance = fakePlatform;