Giter VIP home page Giter VIP logo

flutter-scankit's Introduction


flutter_scankit

中文文档 | English

A scan code Flutter plugin, which is a Flutter package for HUAWEI ScanKit SDK.The HUAWEI ScanKit is a powerful library that is easy to use and fast to read.

Scan Kit automatically detects, magnifies, and recognizes barcodes from a distance, and is also able to scan a very small barcode in the same way. It works even in suboptimal situations, such as under dim lighting or when the barcode is reflective, dirty, blurry, or printed on a cylindrical surface. This leads to a high scanning success rate, and an improved user experience.

  • Android
  • iOS

Scanning Barcodes

ScanKit supports 13 major barcode formats (listed as follows). If your app requires only some of the 13 formats, specify the desired formats to speed up barcode scanning.

  • 1D barcode formats: EAN-8, EAN-13, UPC-A, UPC-E, Codabar, Code 39, Code 93, Code 128, and ITF-14
  • 2D barcode formats: QR Code, Data Matrix, PDF417, and Aztec

Support camera scan code and local picture recognition.

Usage

  1. Configure Permissions
  2. Handling permission requests
  3. Calling APIs

Configure Permissions

iOS

Add the following to ios/Runner/Info.plist

    <key>NSCameraUsageDescription</key>
    <string>Explain to the user here why you need the permission</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>Explain to the user here why you need the permission</string>

Note that replacing the content of the tag gives the user a reason for needing the permission.

No configuration required for Android platform!

Permission Request

In Flutter, you need a plugin library for permission handling, here I recommend using another plugin library of mine: flutter_easy_permission, go here for detailed configuration.

Open the ios/Podfile file and add the following code:

target 'Runner' do
  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
  # Add the library of permissions you need here
  pod 'EasyPermissionX/Camera'
  pod 'EasyPermissionX/Photo'
end

Then execute the command to install.

Calling APIs

import 'package:flutter_scankit/flutter_scankit.dart';


void initState() {
    super.initState();
    scanKit = ScanKit();
    scanKit!.onResult.listen((val) {
      debugPrint("scanning result:${val.originalValue}  scanType:${val.scanType}");
      setState(() {
        code = val.originalValue;
      });
    });

    FlutterEasyPermission().addPermissionCallback(
        onGranted: (requestCode, perms,perm) {
          startScan();
        },
        onDenied: (requestCode, perms,perm, isPermanent) {});
  }

Scan the code:

    // Request if no permission
    if (!await FlutterEasyPermission.has(perms: _permissions,permsGroup: _permissionGroup)) {
          FlutterEasyPermission.request(perms: _permissions,permsGroup: _permissionGroup);
    } else {
          // Call if you have permission
          startScan();
    }
    
    
Future<void> startScan() async {
    try {
      await scanKit?.startScan();
    } on PlatformException {}
}

For instructions on how to use FlutterEasyPermission, please refer to this link.

If we are unsure of the type of code, we can leave the scanTypes parameter unspecified. Of course, you can also choose to specify one or more types, like so:

await scanKit?.startScan(scanTypes: ScanTypes.qRCode.bit);

await scanKit?.startScan(
    scanTypes: ScanTypes.qRCode.bit |
    ScanTypes.code39.bit |
    ScanTypes.code128.bit);

Custom view

Use ScanKitWidget as the scanning widget, and ScanKitController for functions such as switching the flashlight and decoding images. The following is just a simple demonstration, you need to customize the UI according to your own needs:

const boxSize = 200.0;

class CustomView extends StatefulWidget {
  const CustomView({Key? key}) : super(key: key);
  @override
  State<CustomView> createState() => _CustomViewState();
}

class _CustomViewState extends State<CustomView> {
  ScanKitController _controller = ScanKitController();

  @override
  void initState() {
    _controller.onResult.listen((result) {
      debugPrint(
              "scanning result:value=${result.originalValue} scanType=${result.scanType}");

      /// Note: Here the pop operation must be delayed.
      Future(() {
        Navigator.of(context).pop(result.originalValue);
      });
    });
    super.initState();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    var screenWidth = MediaQuery.of(context).size.width;
    var screenHeight = MediaQuery.of(context).size.height;
    var left = screenWidth / 2 - boxSize / 2;
    var top = screenHeight / 2 - boxSize / 2;
    var rect = Rect.fromLTWH(left, top, boxSize, boxSize);

    return Scaffold(
      body: SafeArea(
        child: Stack(
          children: [
            ScanKitWidget(
                    controller: _controller,
                    continuouslyScan: false,
                    boundingBox: rect),
            Align(
              alignment: Alignment.topCenter,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  IconButton(
                          onPressed: () {
                            Navigator.of(context).pop();
                          },
                          icon: Icon(
                            Icons.arrow_back,
                            color: Colors.white,
                            size: 28,
                          )),
                  IconButton(
                          onPressed: () {
                            _controller.switchLight();
                          },
                          icon: Icon(
                            Icons.lightbulb_outline_rounded,
                            color: Colors.white,
                            size: 28,
                          )),
                  IconButton(
                          onPressed: () {
                            _controller.pickPhoto();
                          },
                          icon: Icon(
                            Icons.picture_in_picture_rounded,
                            color: Colors.white,
                            size: 28,
                          ))
                ],
              ),
            ),
            Align(
              alignment: Alignment.center,
              child: Container(
                width: boxSize,
                height: boxSize,
                decoration: BoxDecoration(
                  border: Border(
                          left: BorderSide(color: Colors.orangeAccent, width: 2),
                          right: BorderSide(color: Colors.orangeAccent, width: 2),
                          top: BorderSide(color: Colors.orangeAccent, width: 2),
                          bottom: BorderSide(color: Colors.orangeAccent, width: 2)),
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}

Full Customization

We can use ScanKitDecoder to achieve more flexible customization of scanning requirements. Here is a simple demonstration combined with the camera plugin:

class _BitmapModeState extends State<BitmapMode> {
  CameraController? controller;
  StreamSubscription? subscription;
  String code = '';
  ScanKitDecoder decoder = ScanKitDecoder(photoMode: false, parseResult: false);

  @override
  void initState() {
    availableCameras().then((val) {
      List<CameraDescription> _cameras = val;
      if (_cameras.isNotEmpty) {
        controller = CameraController(_cameras[0], ResolutionPreset.max);
        controller!.initialize().then((_) {
          if (!mounted) {
            return;
          }
          controller!.startImageStream(onLatestImageAvailable);
          setState(() {});
        });
      }
    });

    subscription = decoder.onResult.listen((event) async{
      if (event is ResultEvent && event.value.isNotEmpty()) {
        subscription!.pause();
        await stopScan();
        if (mounted) {
          setState(() {
            code = event.value.originalValue;
          });
        }
      } else if (event is ZoomEvent) {
        /// set zoom value
      }
    });
    super.initState();
  }

  void onLatestImageAvailable(CameraImage image) async {
    if(image.planes.length == 1 && image.format.group == ImageFormatGroup.bgra8888){
      await decoder.decode(image.planes[0].bytes, image.width, image.height);
    }else if(image.planes.length == 3){
      Uint8List y = image.planes[0].bytes;
      Uint8List u = image.planes[1].bytes;
      Uint8List v = image.planes[2].bytes;

      Uint8List combined = Uint8List(y.length + u.length + v.length);
      combined.setRange(0, y.length, y);
      combined.setRange(y.length, y.length + u.length, u);
      combined.setRange(y.length + u.length, y.length + u.length + v.length, v);
      await decoder.decodeYUV(combined, image.width, image.height);
    }
  }
}

You can view the full code in bitmap_mode.dart.

Of course, we can also directly read image files and let ScanKit recognize the codes in the images. This requirement is more suitable for custom loading of code maps from the image library:

class _LoadImageState extends State<LoadImage> {
  ScanKitDecoder decoder = ScanKitDecoder(scanTypes: ScanTypes.qRCode.bit);
  String code = '';

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text(code,maxLines: 2,),
      ),
    );
  }

  void load()async{
    var myData = await rootBundle.load('assets/qrcode.png');
    var result = await decoder.decodeImage(myData.buffer.asUint8List());
    if(result.isNotEmpty){
      setState(() {
        code = result.originalValue;
      });
    }
  }
}

Creating Code Image

  ScanKitEncoder encoder = ScanKitEncoder(200, 200, ScanTypes.qRCode,
      backgroundColor: Colors.blue, color: Colors.red,margin: 2);
  
  ImageProvider? _image;

  void generate() async {
    if(controller.text.isNotEmpty){
      var bytes = await encoder.encode(controller.text);
      final provider = MemoryImage(bytes);
      setState(() {
        _image = provider;
      });
    }
  }

For the complete example, see build_bitmap.dart. Here, the margin parameter defines the border of the code, with a range of [1, 10]. For more information, please refer to the appendix.

FAQs

Android

Does the Scan SDK support third-party devices?

Yes. Non-Huawei Android phones are supported by Scan SDK 1.1.0.300 and later.

What barcodes can be parsed by the Scan SDK?

Currently, the HMS Core Scan SDK can parse most types of 1D and 2D barcodes, including EAN-8, EAN-13, UPC-A, UPC-E, Codabar, Code 39, Code 93, Code 128, ITF-14, QR code, DataMatrix, PDF417, Aztec Code, and the multi-functional code.

Are the algorithms of different APIs the same?

The recognition and parsing algorithms of different APIs are the same.

Are cloud functions involved?

No cloud function is involved, and no personal data is stored.

What can I do if a barcode cannot be parsed?

  1. Install HMS Core (APK) 3.0.3 or later.
  2. Check whether the camera automatically focuses. If not, blurred images cannot be recognized and parsed.
  3. Check whether the format of the scanned 1D or 2D barcode is supported.
  4. If the fault persists, submit a ticket online. Huawei will get back to you as soon as possible.

When a transaction-related app calls the barcode scanning function, private information such as bank card numbers will be targeted. Is the card number storage secure?

Scan Kit processes data only on devices and does not store any personal data, ensuring the security of private data.

Why does Scan Kit use the network module?

The reason can be found in SDK Privacy Statement.

iOS

From which version does the Scan SDK support iOS?

HMS Core Scan SDK 1.2.0.300 and later support phones running iOS 9.0 and later.

What barcodes can be parsed by the Scan SDK?

Currently, the HMS Core Scan SDK can parse most of 1D and 2D barcodes, including EAN-8, EAN-13, UPC-A, UPC-E, Codabar, Code 39, Code 93, Code 128, ITF-14, QR code, DataMatrix, PDF417, and Aztec Code.

How can I resolve the problem that occurs when I archive and release an iOS app?

The SDK can run properly, but the error message "Unsupported Architecture. Your executable contains unsupported architecture '[x86_64]..." is displayed when an iOS app is released.

To facilitate debugging, ScanKitFrameWork.framework combines simulator and real device architectures. Before the release, use the lipo tool to remove the related architectures. For details, please refer to the following code:

cd ScanKitFrameWork.framework
# Run the lipo -info command to check the included architectures.
lipo -info ScanKitFrameWork  # Architectures in the fat file: ScanKitFrameWork are: x86_64 arm64
# Remove x86_64.
lipo -remove x86_64 ScanKitFrameWork -o ScanKitFrameWork
# Check again.
lipo -info  ScanKitFrameWork # Architectures in the fat file: ScanKitFrameWork are: arm64

How can I resolve the problem when error message "Undefined symbols for architecture armv7" is displayed?

The Scan SDK integrated in the iOS system does not support the ARMv7 architecture. Therefore, the ARMv7 architecture needs to be removed from the development project.

How can I resolve the problem that the simulator still needs to be used for debugging after the simulator architecture is deleted for the iOS system?

Integrate the SDK that contains the simulator architecture again. For details, please refer to Integrating the HMS Core SDK.

Appendix

Recommended Settings for Barcode Generation

  • Recommended barcode color and background

    It is recommended that the default setting (black barcode against white background) be used. If white barcode against black background is used, the recognition success rate will decrease.

  • Recommended border

    It is recommended that the default border be used. The value ranges from 1 to 10, in pixels.

  • Recommended barcode size

    1. For the QR code, DataMatrix, and Aztec, it is recommended that the width and height be the same and greater than 200. Otherwise, the barcodes generated will be too small to be recognized.
    2. For EAN-8, EAN-13, UPC-A, UPC-E, Codabar, Code 39, Code 93, Code 128, ITF-14, and PDF417, it is recommended that the ratio of width to height be 2:1 and the width be greater than 400. Otherwise, the barcodes generated will be too small to be recognized.
  • Barcode length and content restrictions

Barcode Format Length Restriction Content Restriction
QR A maximum of 2953 UTF-8 encoded bytes are supported. Chinese characters are supported. One Chinese character occupies three bytes. If the content is too long, the barcode will be complex and cannot be easily recognized.
Aztec A maximum of 2953 UTF-8 encoded bytes are supported. Chinese characters are supported. One Chinese character occupies three bytes. If the content is too long, the barcode will be complex and cannot be easily recognized.
PDF417 A maximum of 1777 UTF-8 encoded bytes are supported. Chinese characters are supported. One Chinese character occupies three bytes. If the content is too long, the barcode will be complex and cannot be easily recognized.
DataMatrix A maximum of 2335 UTF-8 encoded bytes are supported. iOS supports Chinese and English, in which one Chinese character occupies three bytes. Android supports only English. If the content is too long, the barcode will be complex and cannot be easily recognized.
UPC-A An 11-digit number must be entered. Only numbers are supported. A barcode in this format is a 12-digit number (with the last digit used for verification).
UPC-E A 7-digit number must be entered. Only numbers are supported. A barcode in this format is an 8-digit number (with the last digit used for verification), and the first digit must be 0 or 1.
ITF14 A number with up to 80 digits is allowed and must contain an even number of digits. Only numbers are supported. A barcode containing an even number of digits is generated. If the content is too long, the barcode will be complex and cannot be easily recognized.
EAN-8 A 7-digit number must be entered. Only numbers are supported. A barcode in this format is an 8-digit number (with the last digit used for verification).
EAN-13 A 12-digit number must be entered. Only numbers are supported. A barcode in this format is a 13-digit number (with the last digit used for verification), and the first digit cannot be 0. If the first digit is not 0 for Android, a UPC-A code is generated.
Code 39 A maximum of 80 bytes are supported. The charset supported contains numbers, uppercase letters, hyphens (-), dots (.), dollar signs ($), slashes (/), plus signs (+), percent signs (%), and spaces.
Code 93 A maximum of 80 bytes are supported. The charset supported contains numbers, uppercase letters, hyphens (-), dots (.), dollar signs ($), slashes (/), plus signs (+), percent signs (%), asterisks (*), and spaces.
Code 128 A maximum of 80 bytes are supported. The charset supported is the same as that in the encoding table.
Codabar A maximum of 2953 UTF-8 encoded bytes are supported. If a barcode in this format starts with letter A, B, C, D, T, N, or E, or with an asterisk (*), the barcode must end with the same character. If the barcode does not start with any of the characters, add letter A to the beginning and end of the barcode. Other characters in the barcode can be numbers, hyphens (-), dots (.), dollar signs ($), slashes (/), colons (:), and plus signs (+).

Example

For a complete example, please see here.

flutter-scankit's People

Contributors

arcticfox1919 avatar arcticfox88 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

flutter-scankit's Issues

xcode 12 编译报错

报错信息:

ld: building for iOS Simulator, but linking in dylib built for iOS, file '.../ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork' for architecture arm64

iOS build error due to bitcode

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 2.0.4, on Mac OS X 10.15.6 19G2021 darwin-x64,
locale zh-Hans-CN)
[!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
✗ Android license status unknown.
Run flutter doctor --android-licenses to accept the SDK licenses.
See https://flutter.dev/docs/get-started/install/macos#android-setup for
more details.
[!] Xcode - develop for iOS and macOS
! CocoaPods 1.9.3 out of date (1.10.0 is recommended).
CocoaPods is used to retrieve the iOS and macOS platform side's plugin
code that responds to your plugin usage on the Dart side.
Without CocoaPods, plugins will not work on iOS or macOS.
For more info, see https://flutter.dev/platform-plugins
To upgrade see
https://guides.cocoapods.org/using/getting-started.html#installation for
instructions.
[✓] Chrome - develop for the web
[✓] Android Studio (version 4.1)
[✓] Connected device (2 available)

/Users/test1/klapp/aaa/flutter_app1/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. file '/Users/test1/klapp/aaa/flutter_app1/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork' for architecture arm64

IOS build error

Hi, my IOS build is error, after searching the issue this caused by target architecture which should be arm64 and i have update it in xcode.
Screen Shot 2022-03-07 at 16 25 02

But i still can't build it. Below is the error log

ld: building for iOS Simulator, but linking in dylib built for iOS, file '~/app/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork' for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

调用 pickPhoto 报错

企业微信截图_20220314154247
企业微信截图_20220314154324
企业微信截图_20220314154428

使用自定义视图组件时,调用 _controller.pickPhoto(); 选择图片完毕后是能正确返回结果,但是扫描程序还在运行没有立即停止,而且报错,当第二次继续使用_controller.pickPhoto() 时直接黑屏,或者报错
Flutter 2.8.1
Android 10 及以上

Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionPointIdentifierToBundleIdentifier for extension Xcode.DebuggerFoundation.AppExtensionToBundleIdentifierMap.watchOS of plug-in com.apple.dt.IDEWatchSupportCore

构建 ios-framework报错

执行命令:flutter build ios-framework --release --output=xwifi-ios-framework

输出日志

Unable to build plugin frameworks for simulator: 2022-06-23 17:23:40.446 xcodebuild[74220:13798814] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionSentinelHostApplications for extension
Xcode.DebuggerFoundation.AppExtensionHosts.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
2022-06-23 17:23:40.449 xcodebuild[74220:13798814] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionPointIdentifierToBundleIdentifier for extension
Xcode.DebuggerFoundation.AppExtensionToBundleIdentifierMap.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
** BUILD FAILED **


The following build commands failed:
        Ld /Users/chenxinlei/BehemothCloud-Projects/x_wifi_flutter/xwifi-ios-framework/Debug/iphonesimulator/Debug-iphonesimulator/flutter_scankit/flutter_scankit.framework/flutter_scankit normal (in target 'flutter_scankit' from project
        'Pods')
(1 failure)

flutter 版本

Flutter 3.0.2 • channel stable • https://github.com/flutter/flutter.git
Framework • revision cd41fdd495 (2 weeks ago) • 2022-06-08 09:52:13 -0700
Engine • revision f15f824b57
Tools • Dart 2.17.3 • DevTools 2.12.2

使用一段时间发现2个会偶现的BUG

试了一段时间,遇到两个偶现的BUG,出现频率未知,但一定会出现。
我这里主要是用来扫条码。
BUG1:识别结果错误,结果与条码数据差异很大,看起来就是每位数字都不一样的那种。
BUG2:连续响应结果,明明只扫码了一次,但是结果却触发了两次

ScanKitWidget(
	callback: (controller) {
	  _controller = controller;
	  controller.onResult.listen((result) {
		DateTime dtNow = DateTime.now();
		if (dtNow.difference(dt).inMilliseconds < 1000) {
		  debugPrint(result);
		  //偶现的连续触发,忽略其结果
		  return;
		}
		dt = dtNow;
		Get.back(result: result);
	  });
	},
	continuouslyScan: false,
	boundingBox: rect),

第二个BUG我可以暂时使用上面的方式来规避,但第一个却没有办法规避。

在pub上试了两款扫码插件,scankit识别率高,识别速度快,但启动速度不是最快的,我每次扫码从弹出相机到得到扫码结果耗费的时间在2.5秒左右,如果可能还是希望能提升下启动速度。

ios编译失败: Undefined symbols for architecture armv7

ld: warning: ignoring file
/Users/f/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/
ScanKitFrameWork.framework/ScanKitFrameWork, missing required architecture
armv7 in file
/Users/f/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/
ScanKitFrameWork.framework/ScanKitFrameWork (2 slices)
Undefined symbols for architecture armv7:
"OBJC_CLASS$_HmsBitMap", referenced from:

日志取消

您好,我现在有个疑问,在开启扫码时会有很多日志,这些日志如何取消呢

插件不能使用,Flutter2.5,三星S8

======== Exception caught by services library ======================================================
The following MissingPluginException was thrown while de-activating platform stream on channel xyz.bczl.flutter_scankit/event:
MissingPluginException(No implementation found for method cancel on channel xyz.bczl.flutter_scankit/event)

When the exception was thrown, this was the stack: 
#0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:154:7)
<asynchronous suspension>
#1      EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:498:9)
<asynchronous suspension>
====================================================================================================

format限定为CODE128时不能识别条码

这应该是个bug,不填写format和手动传入ALL可识别CODE128条码,当强制指定format参数为CODE128时却无法识别。

示例代码

return ScanKitWidget(
      callback: (ctrl) {
        _controller = ctrl;
        ctrl.onResult.listen(
          (result) {
            if (filter(result)) {
              Navigator.of(context).pop(result);
            }
          },
        );
      },
      boundingBox: rect,
      continuouslyScan: false,
      format: [ScanTypes.CODE128],
    );

测试平台是:
Android 10
flutter v2.5.1
flutter_scankit v1.2.0

安卓警告

: /Users/ldd/flutter/.pub-cache/hosted/pub.dartlang.org/
flutter_scankit-1.2.4/android/src/main/java/xyz/bczl/flutter_scankit/ScanKitView.java使用或覆盖了已过时的 API

作者拯救下强迫症

解除绑定的问题

我在首页底部的Tab键个扫码的功能 商品添加也有一个扫码功能 第一次当我通过扫码跳转商品添加 第二次就继续通过首页进入商品添加界面时 首页的扫码代码就不走了

1631503058593019.mp4

iPad 横屏模式下取景方向有问题

Hello~非常感谢写了这个 Flutter 插件,因为我对原生开发不熟悉。然后这个插件在横屏模式下扫码取景方向有问题,不知道作者是否有空修复一下这个问题呢?

IMG_ACF637429AC4-1
IMG_ACF637429AC4-2

自定义View扫码没有任何反映

我是一名后端,刚上手flutter,请教一下自定义View如何进行扫码呢?经测试,示例中的自定义的View只能识别到相册里的二维码。
flutter version: 2.10.2

Add in the scan result scanType and scanTypeForm

Hello,

In HMS sdk there is more parameter return from result listener like scanType and ScanTypeForm

ScanResponse response = await HmsScanUtils.startDefaultView(request);
      setState(() {
        resultScan = response.originalValue;
        codeFormatScan = response.scanType;
        resultTypeScan = response.scanTypeForm;
      });

could you please add them to scankit as i need to get what is the scantype, is it barcode or qrcode or datamatrix

flutter2.2空安全

你好,作为一个初学者,我最在使用插件时出现了不支持空安全的问题,FlutterSDK为2.2版本,请问是否有考虑升级该插件,
image

ios部分设备扫码会闪退

flutter版本:2.5
ios版本:15.1
错误日志:
libc++abi: terminating with uncaught exception of type zxing::Exception

  • thread #46, queue = 'HmsImageProcesser', stop reason = signal SIGABRT
    frame #0: 0x00000001bca769e8 libsystem_kernel.dylib__pthread_kill + 8 libsystem_kernel.dylib__pthread_kill:
    -> 0x1bca769e8 <+8>: b.lo 0x1bca76a04 ; <+36>
    0x1bca769ec <+12>: stp x29, x30, [sp, #-0x10]!
    0x1bca769f0 <+16>: mov x29, sp
    0x1bca769f4 <+20>: bl 0x1bca72670 ; cerror_nocancel
    Target 0: (Runner) stopped.

Using deprecated API.

Hi. I get this warning when I compile the Fluuer app.

ScanKitView.java uses or overrides a deprecated API.

Can the library be updated to use the current API?

Camera is being used after Camera.release() was called

scankit:v.1.2.3
设备:小米10pro、华为均会出现

我在扫码界面有个手动输入编号的按钮可以跳转到另一个页面输入,输入完成后pop到扫码界面然后继续pop到上一级页面,这过程当中有挺大的几率会出现这个问题,一下是我的代码
`class ScanCodePage extends BaseStatefulWidget {

bool scanBicycle;

ScanCodePage({this.scanBicycle = false});

@OverRide
State createState() => _ScanCodeState();
}

const boxSize = 200.0;

class _ScanCodeState extends BaseState<ScanCodePage, ScanCodeViewModel> with WidgetsBindingObserver {

final screenWidth = window.physicalSize.width;
final screenHeight = window.physicalSize.height;

late ScanKitController _controller;

@OverRide
void initState() {
super.initState();
WidgetsBinding.instance!.addObserver(this);
}

@OverRide
Widget build(BuildContext context) {
var stateHeight = ScreenUtil.getStatusBarHigh();
var pixelSize = boxSize * window.devicePixelRatio;
var left = screenWidth/2 - pixelSize/2;
var top = screenHeight/2 - pixelSize/2;
var right = screenWidth/2 + pixelSize/2;
var bottom = screenHeight/2 + pixelSize/2;
var rect = Rect.fromLTRB(left, top, right, bottom);

return Scaffold(
  body: Stack(
    children: [
      ScanKitWidget(
        format: const [ScanTypes.QRCODE],
        callback: (controller) {
          _controller = controller;
          controller.onResult.listen((result) {
            debugPrint("scanning result:$result");
            Navigator.of(context).pop(result);
          });
        },
        continuouslyScan: false,
        boundingBox: rect
      ),

      ///文本提示
      Offstage(
        offstage: !widget.scanBicycle,
        child: Align(
          alignment: Alignment.center,
          child: Padding(
            padding: EdgeInsets.only(bottom: 400),
            child: Text(MString.scan_hint, style: TextStyle(color: Colors.white, fontSize: 16),),
          ),
        ),
      ),

      ///扫描边框
      Align(
        alignment: Alignment.center,
        child: Container(
          width: boxSize,
          height: boxSize,
          child: Image.asset(ImageAssets.imagesIconScanBorder, width: boxSize, height: boxSize),
        ),
      ),

      ///返回按钮
      Positioned(
        top: stateHeight,
        left: 8,
        child: IconButton(
          onPressed: () {
            Navigator.of(context).pop();
          },
          icon: Image.asset(ImageAssets.imagesIconScanBack)
        ),
      ),

      ///相册选择
      Positioned(
        top: stateHeight,
        right: 8,
        child: Offstage(
          offstage: widget.scanBicycle,
          child: IconButton(
              onPressed: () {
                _controller.pickPhoto();
              },
              icon: Image.asset(ImageAssets.imagesIconScanPhoto)
          ),
        ),
      ),

      ///底部2个开关按钮
      Offstage(
        offstage: !widget.scanBicycle,
        child: Container(
          margin: EdgeInsets.only(bottom: 54.5, left: 30, right: 30),
          alignment: Alignment.bottomCenter,
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: [

              ///手动输入
              Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  IconButton(
                    onPressed: () { _jumpInputBikeNum(); },
                    icon: Image.asset(ImageAssets.imagesIconScanInputNum),
                    iconSize: 50,
                  ),
                  Text(MString.scan_input_num, style: TextStyle(color: Colors.white, fontSize: 14),)
                ],
              ),

              ///打开手电筒
              Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  IconButton(
                    onPressed: () {
                      _controller.switchLight();
                    },
                    icon: Image.asset(ImageAssets.imagesIconScanLight),
                    iconSize: 50,
                  ),
                  Text(MString.scan_open_light, style: TextStyle(color: Colors.white, fontSize: 14),)
                ],
              ),
            ],
          ),
        ),
      ),
    ],
  ),
);

}

///跳转输入编号页面
void _jumpInputBikeNum() async{
_controller.pauseContinuouslyScan();
pushForResult(InputNumberPage(), (result) async{
if(result != null) {
pop(result);

  } else {
    _controller.resumeContinuouslyScan();
  }
});

}

@OverRide
void didChangeAppLifecycleState(AppLifecycleState state) async{
super.didChangeAppLifecycleState(state);
if(state == AppLifecycleState.resumed) {
_controller.resumeContinuouslyScan();
}

if(state == AppLifecycleState.paused) {
  _controller.pauseContinuouslyScan();
}

}

@OverRide
void dispose() {
WidgetsBinding.instance!.removeObserver(this);
_controller.dispose();
super.dispose();
}
}`

xcode 打包错误

normal/armv7/Binary/flutter_scankit normal armv7 (in target 'flutter_scankit' from project 'Pods')

部分安卓在打开键盘的页面跳转自定义扫码页面出现闪退

第一段异常日志

D/ScanKitView(17729): ScanKitView create ...
I/ScanKitRemoteView(17729): onCreate:
D/DeferredLifecycleHelper(17729): IDelegateLifeCycleCall onCreate:
I/NetworkKit_CountryCodeBean(17729): main|null|com.huawei.hms.framework.network.grs.local.model.CountryCodeBean| getVendorCountryCode|39|countryCode by ro.hw.country is: cn
I/NetworkKit_CountryCodeBean(17729): main|null|com.huawei.hms.framework.network.grs.local.model.CountryCodeBean| init|15|get issue_country code from VENDOR_COUNTRY
I/NetworkKit_Cc(17729): main|CountryCodeBean.java|com.huawei.hms.scankit.p.Cc|a|4|getCountryCode unknown
I/e (17729): initCameraConfig:false
I/e (17729): onCreate: CameraManageOncreate
E/HaLogProvider(17729): forbiddenHiLog openHa = false
E/HaLogProvider(17729): forbiddenHiLog.getVenderCountry=cn
I/HaLogProvider(17729): init timer, timer=java.util.Timer@7b3fb8f,moduleName=MLKitCamera I/ScanKitRemoteView(17729): onStart:
D/DeferredLifecycleHelper(17729): IDelegateLifeCycleCall onStart:
I/ScanKitRemoteView(17729): onResume:
D/DeferredLifecycleHelper(17729): IDelegateLifeCycleCall onResume:
I/NetworkKit_CountryCodeBean(17729): main|null|com.huawei.hms.framework.network.grs.local.model.CountryCodeBean| getVendorCountryCode|39|countryCode by ro.hw.country is: cn
I/NetworkKit_CountryCodeBean(17729): main|null|com.huawei.hms.framework.network.grs.local.model.CountryCodeBean| init|15|get issue_country code from VENDOR_COUNTRY
I/NetworkKit_Cc(17729): main|CountryCodeBean.java|com.huawei.hms.scankit.p.Cc|a|4|getCountryCode unknown D/SensorManager(17729): 0x791966b730 addFd fd=145
I/DecorView: pkgName:com.example.zerobotmobileapp old windowMode:0 new windoMode:1, isFixedSize:false D/MouseWheelSynthesizer(17729): mMoveStepInDp: 64, mMoveStepInPixel: 192, mUpTimeDelayed: 100 D/ViewRootImpl(17729): ViewRootImpl mIsInProductivePCDisplay: false
D/InputEventReceiver(17729): dispatchInputInterval 1000000
I/HiTouch_HiTouchSensor(17729): HiTouch restricted: Sub windows restricted.
D/HiTouch_PressGestureDetector(17729): onAttached, package=com.example.zerobotmobileapp, windowType=2030, mIsHiTouchRestricted=true
D/mali_winsys(17729): EGLint new_window_surface(egl_winsys_display *, void *, EGLSurface, EGLConfig, egl_winsys_surface **, EGLBoolean) returns 0x3000
W/CameraManager(17729): CameraManager::initCamera camera is not opened yet
I/CameraManager(17729): findCameraId: 0
I/Camera (17729): open camera: 0, package name: com.example.zerobotmobileapp
D/CameraManager(17729): initCameraParameters previewCameraSize: Point(1920, 1080)
I/CameraManager(17729): setFocusMode: continuous-picture
I/DecodeThread(17729): Hints: {POSSIBLE_FORMATS=[CODABAR, CODE_39, CODE_93, CODE_128, DATA_MATRIX, EAN_8, EAN_13, ITF, QR_CODE, UPC_A, UPC_E], NEED_RESULT_POINT_CALLBACK=Handler (com.huawei.hms.scankit.a) {5a43b38}}
D/ScankitDecode(17729): use remote decoder
I/ScankitSDK(17729): ScankitSDK Version: SCANLITE2.1.0.300
I/ScankitSDK(17729): context has been inited
I/ScankitDecode(17729): doInBackground:
D/scan-time(17729): start preview time:1653904582269
D/CameraManager(17729): CameraManager::requestPreviewFrame PREVIEW_ONE_SHOT D/OpenGLRenderer(17729): disableOutlineDraw is true
I/DecorView: pkgName:com.example.zerobotmobileapp old windowMode:0 new windoMode:1, isFixedSize:false D/MouseWheelSynthesizer(17729): mMoveStepInDp: 64, mMoveStepInPixel: 192, mUpTimeDelayed: 100 D/ViewRootImpl(17729): ViewRootImpl mIsInProductivePCDisplay: false
D/InputEventReceiver(17729): dispatchInputInterval 1000000
I/ViewRootImpl(17729): dispatchDetachedFromWindow in doDie
W/libEGL (17729): EGLNativeWindowType 0x7919fe7710 disconnect failed
I/HiTouch_HiTouchSensor(17729): HiTouch restricted: Sub windows restricted.
D/HiTouch_PressGestureDetector(17729): onAttached, package=com.example.zerobotmobileapp, windowType=2030, mIsHiTouchRestricted=true
D/mali_winsys(17729): EGLint new_window_surface(egl_winsys_display *, void *, EGLSurface, EGLConfig, egl_winsys_surface **, EGLBoolean) returns 0x3000
W/CameraManager(17729): CameraManager::initCamera camera is not opened yet
E/BufferQueueProducer(17729): [SurfaceTexture-0-17729-3]:855: queueBuffer: BufferQueue has been abandoned E/BufferQueueProducer(17729): [SurfaceTexture-0-17729-3]:855: queueBuffer: BufferQueue has been abandoned E/BufferQueueProducer(17729): [SurfaceTexture-0-17729-3]:855: queueBuffer: BufferQueue has been abandoned E/BufferQueueProducer(17729): [SurfaceTexture-0-17729-3]:855: queueBuffer: BufferQueue has been abandoned E/BufferQueueProducer(17729): [SurfaceTexture-0-17729-3]:855: queueBuffer: BufferQueue has been abandoned E/BufferQueueProducer(17729): [SurfaceTexture-0-17729-3]:855: queueBuffer: BufferQueue has been abandoned E/BufferQueueProducer(17729): [SurfaceTexture-0-17729-3]:855: queueBuffer: BufferQueue has been abandoned
D/CameraManager(17729): initCameraParameters previewCameraSize: Point(1920, 1080) I/CameraManager(17729): setFocusMode: continuous-picture
I/Choreographer(17729): Skipped 32 frames! The application may be doing too much work on its main thread. D/OpenGLRenderer(17729): disableOutlineDraw is true
W/System (17729): A resource failed to call release.

第二段异常日志

I/ScanKitRemoteView(23155): onDestroy:
E/HaLogProvider(23155): forbiddenHiLog openHa = false
E/HaLogProvider(23155): forbiddenHiLog.getVenderCountry=cn
E/HaLogProvider(23155): forbiddenHiLog.getVenderCountry=cn
I/HaLogProvider(23155): cancel timer, timer=java.util.Timer@de1de1c,moduleName=MLKitCamera
I/BlockMonitor(23155): dispatchingThrewException In MainThread
D/AndroidRuntime(23155): Shutting down VM
I/QarthLog(23155): [PatchStore] createDisableExceptionQarthFile
I/QarthLog(23155): [PatchStore] create disable file for com.example.zerobotmobileapp uid is 10424
E/AndroidRuntime(23155): FATAL EXCEPTION: main
E/AndroidRuntime(23155): Process: com.example.zerobotmobileapp, PID: 23155
E/AndroidRuntime(23155): java.lang.RuntimeException: Camera is being used after Camera.release() was called
E/AndroidRuntime(23155): at android.hardware.Camera.setHasPreviewCallback(Native Method)
E/AndroidRuntime(23155): at android.hardware.Camera.access$600(Camera.java:156)
E/AndroidRuntime(23155): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1275)
E/AndroidRuntime(23155): at android.os.Handler.dispatchMessage(Handler.java:110)
E/AndroidRuntime(23155): at android.os.Looper.loop(Looper.java:219)
E/AndroidRuntime(23155): at android.app.ActivityThread.main(ActivityThread.java:8668)
E/AndroidRuntime(23155): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(23155): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
E/AndroidRuntime(23155): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)
I/Process (23155): Sending signal. PID: 23155 SIG: 9

具体机型为华为nova6 系统鸿蒙2.0.0.230/三星note10+系统版本安卓10

编译环境
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 2.8.1, on macOS 12.4 21F79 darwin-arm, locale
zh-Hans-CN)
[✓] Android toolchain - develop for Android devices (Android SDK version
32.1.0-rc1)
[✓] Xcode - develop for iOS and macOS (Xcode 13.4)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.1)
[✓] IntelliJ IDEA Ultimate Edition (version 2021.2.2)
[✓] VS Code (version 1.67.2)
[✓] Connected device (2 available)

Building for iOS Simulator, but linking in dylib built for iOS

` note: Using new build system
note: Planning
note: Build preparation complete
note: Building targets in dependency order
/Users/yangni/yo-tai-cloud_-ati_-installing_-app/ios/Pods/Pods.xcodeproj: warning: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 15.5.99. (in target 'Reachability' from project 'Pods')
/Users/yangni/yo-tai-cloud_-ati_-installing_-app/ios/Pods/Pods.xcodeproj: warning: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 15.5.99. (in target 'EasyPermissionX' from project 'Pods')
/Users/yangni/yo-tai-cloud_-ati_-installing_-app/ios/Pods/Pods.xcodeproj: warning: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 15.5.99. (in target 'Toast' from project 'Pods')
/Users/yangni/yo-tai-cloud_-ati_-installing_-app/ios/Pods/Pods.xcodeproj: warning: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 15.5.99. (in target 'FMDB' from project 'Pods')
Result bundle written to path:
/var/folders/j0/l062m7q174l5tj_jclntpyhw0000gn/T/flutter_tools.htHJ9z/flutter_ios_build_temp_dirMCpEPe/temporary_xcresult_bundle
Error (Xcode): Building for iOS Simulator, but linking in dylib built for iOS, file '/Users/yangni/yo-tai-cloud_-ati_-installing_-app/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork' for architecture arm64

Could not build the application for the simulator.
Error launching application on iPhone 13. `

请问应该怎么解决呀,我是Mac Air m1芯片

Undefined symbols for architecture armv7

ios debug可以用,打包ipa报错

ld: warning: ignoring file /Users/ieducc/develop/cloud/flutter_cloud/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork, missing required architecture armv7 in file
    /Users/ieducc/develop/cloud/flutter_cloud/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork (2 slices)
    Undefined symbols for architecture armv7:
      "_OBJC_CLASS_$_HmsBitMap", referenced from:
          objc-class-ref in FLScanKitView.o
          objc-class-ref in FlutterScankitPlugin.o
      "_OBJC_CLASS_$_HmsDefaultScanViewController", referenced from:
          objc-class-ref in FlutterScankitPlugin.o
      "_OBJC_CLASS_$_HmsCustomScanViewController", referenced from:
          objc-class-ref in FLScanKitView.o
      "_OBJC_CLASS_$_HmsScanOptions", referenced from:
          objc-class-ref in FLScanKitView.o
          objc-class-ref in FlutterScankitPlugin.o
    ld: symbol(s) not found for architecture armv7
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    note: Using new build system
    note: Building targets in parallel
    note: Planning build
    note: Analyzing workspace
    note: Constructing build description
    note: Build preparation complete

在xcode12要怎样设置才能移除armv7支持

打包报错

Xcode's output: ↳ ld: warning: ignoring file /Users/wt01/Desktop/app/mini-cashier-app/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork, missing required architecture armv7 in file /Users/wt01/Desktop/app/mini-cashier-app/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork (2 slices) Undefined symbols for architecture armv7: "_OBJC_CLASS_$_HmsBitMap", referenced from: objc-class-ref in FLScanKitView.o objc-class-ref in FlutterScankitPlugin.o "_OBJC_CLASS_$_HmsDefaultScanViewController", referenced from: objc-class-ref in FlutterScankitPlugin.o "_OBJC_CLASS_$_HmsCustomScanViewController", referenced from: objc-class-ref in FLScanKitView.o "_OBJC_CLASS_$_HmsScanOptions", referenced from: objc-class-ref in FLScanKitView.o objc-class-ref in FlutterScankitPlugin.o ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation) note: Using new build system note: Planning note: Build preparation complete note: Building targets in parallel
请教大佬帮帮忙看看 急急急!!!

扫码完毕之后抛出异常

The following MissingPluginException was thrown while de-activating platform stream on channel xyz.bczl.flutter_scankit/event:
MissingPluginException(No implementation found for method cancel on channel xyz.bczl.flutter_scankit/event)

When the exception was thrown, this was the stack:
#0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:154:7)

#1 EventChannel.receiveBroadcastStream. (package:flutter/src/services/platform_channel.dart:498:9)

小米11,flutter2.5.3

Undefined symbols for architecture armv7:

ld: warning: ignoring file /Users/jme/jme/dev/app/flutter/flutter_energy_app_getx/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork, file is universal (x86_64,arm64) but does not contain the armv7 architecture: /Users/jme/jme/dev/app/flutter/flutter_energy_app_getx/ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork
Undefined symbols for architecture armv7:
"OBJC_CLASS$_HmsBitMap", referenced from:
objc-class-ref in FLScanKitView.o
objc-class-ref in FlutterScankitPlugin.o
"OBJC_CLASS$_HmsDefaultScanViewController", referenced from:
objc-class-ref in FlutterScankitPlugin.o
"OBJC_CLASS$_HmsCustomScanViewController", referenced from:
objc-class-ref in FLScanKitView.o
"OBJC_CLASS$_HmsScanOptions", referenced from:
objc-class-ref in FLScanKitView.o
objc-class-ref in FlutterScankitPlugin.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

xcode13.3.1

addResultListen监听事件是单例

我有两个FlutterScanKit实例,后注册addResultListen的监听正常,前面注册的监听都被覆盖,当任意实例dispose后,后注册的监听也失效。

以下代码可做验证

var sn = FlutterScankit();
sn.addResultListen((p0) {
    print("扫描A:$p0");
    sn.dispose();
});
var sn1 = FlutterScankit();        
//sn.dispose();
sn1.addResultListen((p0) {
    print("扫描B:$p0");
    sn.dispose();
});
sn.dispose();
sn1.startScan(scanTypes: [ScanTypes.ALL]);

环境信息
flutter_scankit: ^1.2.4
Flutter 2.10.5

iOS打包出错

 ld: 'ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor,
    or disable bitcode for this target. file 'ios/Pods/ScanKitFrameWork/scansdk-ios-tool-1.0.2.300/ScanKitFrameWork.framework/ScanKitFrameWork' for architecture arm64

On iOS can click what's behind camera screen

When triggering scanKit.startScan() method, I can still tapping whats behind the camera screen, and causing it to run the action,

Below is the screenshot when i am clicking on camera screen and tap an action to open webview.

IMG_4797

flutter_scankit: ^1.2.3
flutter: 2.10.1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.