Author: tidu01059

  • [Flutter] Xuất bản flutter web lên Github

    [Flutter] Xuất bản flutter web lên Github

    [Flutter] Xuất bản flutter web lên Github

    Giới thiệu

    Github có chức năng rất nay là giúp các bạn đưa trang web của mình lên hoàn toàn miễn phí. Hôm mình mình sẽ hướng dẫn các bạn cách deploy 1 trang web Flutter lên Github nhé. Cùng bắt đầu thôi nào!

    Các bước thực hiện

    Để deploy 1 trang web flutter lên github. Trước tiên chúng ta cần tạo 1 repository trên github, sau đó tạo 1 dự án flutter và đẩy nó lên github.

    Tạo repository Github

    • Các bạn vào link github.com, đăng nhập vào và nhấn New nhé

    • Ở Repository name mình sẽ điền đại 1 tên là demo_flutter_web và nhấn Create repository

    • Sau đó mình sẽ được dẫn tới link repository https://github.com/tiendung01023/demo_flutter_web. Các bạn nhớ link github này nha, tý mình sẽ dùng tới

    Xong phần khởi tạo repository git. Giờ mình đến phần flutter thôi.

    Tạo dự án flutter

    • Các bạn mở Terminal lên và tạo 1 project nha. Ở đây mình sẽ đặt tên là demo_web
    flutter create demo_web
    
    • Giờ tiếp tục tại terminal, mình cd vô dự án
    cd demo_web
    
    • Vì giờ mình quan tâm đến web, tạm thời bỏ qua mobile. Nên mình sẽ chạy lệnh build trên chrome xem trang web chạy trên local sẽ như thế nào ha

    • Chạy demo xong các bạn nhấn Ctrl + C trên Windows hoặc control + C trên MacOS để dừng demo.

    • Lưu ý: khi bạn muốn deploy web của mình lên github. Bạn cần thêm tên repository vào file như sau:

    -> Bạn mở file demo_web/web/index.html bằng bất kì trình chỉnh sửa nào

    -> Dự án github mình đặt là demo_flutter_web. Tại thẻ base bạn sửa lại thành <base href="/demo_flutter_web/"> và nhấn lưu lại

    • Tiếp theo tại terminal mình sẽ chạy câu lệnh build flutter bản web
    flutter build web
    
    • Sau khi lệnh chạy xong bạn sẽ thấy thêm thư mục demo_web/build/web. Bạn cd terminal đến thư mục này. Mình sẽ chỉ publish thư mục này lên git thôi nha.
    cd build/web
    
    • Giờ mình upload thư mục này lên github. Các bạn mở lại link github repository sẽ có phần hướng dẫn nha, hoặc các bạn chạy từng dòng lệnh như mình làm dưới đây cũng được
    git init
    git add .
    git commit -m "first commit"
    git branch -M master
    git remote add origin [email protected]:tiendung01023/demo_flutter_web.git
    git push -u origin master
    
    • Sau khi chạy hết các bạn lên repo github xem các file đã được upload lên chưa nha

    Thế là đã xong phần tạo và upload dự án flutter_web lên github. Về sau khi bạn viết thêm chức năng cho dự án, bạn cần chạy lại câu lệnh build web và push data mới lên github nha.

    Tạo page demo trang web trên github

    • Vào link github. Chọn tab Settings, xuống mục Pages

    • Trong Github Pages, bạn chọn nhánh mà muốn hiển thị trang web, hiện tại của mình thì chọn master nha. Sau đó nhấn Save

    Như hình trên Github báo đã tạo thành công trang web Your site is published at https://tiendung01023.github.io/demo_flutter_web/. Bạn bấm vào link đó để xem thành quả nha

    Kết thúc

    Hi vọng qua bài viết của mình sẽ giúp bạn sáng tạo thêm 1 số trò với flutter web này nha

    Cảm ơn các bạn đã xem bài viết.

    Tác giả

    Phạm Tiến Dũng [email protected]

  • [Flutter] Hướng dẫn tăng điểm trên pub.dev

    [Flutter] Hướng dẫn tăng điểm trên pub.dev

    Giới thiệu

    Ở bài trước mình đã giới thiệu về cách upload plugin lên pub.dev (Xem lại tại đây). Hôm nay mình sẽ nói về cách tăng điểm pub points trên pub.dev nhé. Cùng bắt đầu thôi nào!

    Phân tích cách tính điểm trên pub.dev

    Trên pub.dev sẽ có 6 mục lớn để tính điểm cho plugin của bạn

    Tuân thủ quy ước của Dart (20 điểm)

    • 10 điểm: Cung cấp file pubspec.yaml hợp lệ
    • 5 điểm: Cung cấp file README.md hợp lệ
    • 5 điểm: Cung cấp file CHANGELOG.md hợp lệ

    Các bạn có thể tham khảo bài viết trước của mình nha

    Cung cấp hướng dẫn (20 điểm)

    • 10 điểm: Có ví dụ. Pub.dev sẽ lấy file example/lib/main.dart để làm ví dụ cho người dùng. Bạn nên cung cấp ví dụ đầy đủ trong 1 file này. Vì người khác sẽ ngại việc lấy project của bạn để hiểu được plugin của bạn dùng như thế nào
    • 10 điểm: Cung cấp hướng dẫn cho từng API. Theo yêu cầu của pub.dev thì bạn phải cung cấp ít nhất 20% các api. Tức ở mỗi biến, hàm, lớp được tạo ra, bạn phải thêm hướng dẫn bằng ///

    Hỗ trợ nhiều nền tảng (20 điểm)

    • 20 điểm: Pub.dev cần bạn hỗ trợ android, ios và web. Nếu chỉ hỗ trợ android và ios thôi thì bạn sẽ chỉ được 10 điểm. Sau khi code android và ios xong thì bạn nên nghiên cứu thêm cho cả bản web nữa nha

    Vượt qua bộ phân tích (30 điểm)

    • 30 điểm: Bạn cần fix hết các lỗi,cảnh báo, vấn đề. Hiện tại mình không chắc pub.dev dùng bộ check nào, hiện tại mình dùng bộ này và đã đạt được 30/30 điểm. Các bạn thử xem, nếu có bộ nào tốt hơn các bạn gợi ý cho mình dưới comment nha.

    Các gói phụ thuộc phải được cập nhật (10 điểm)

    • 10 điểm: Khi bạn thêm gói vào dependencies và dev-dependencies. Bạn cần cập nhật bản mới nhất cho những gói đó### Các gói phụ thuộc phải được cập nhật

    Hỗ trợ null-safety (20 điểm)

    • 20 điểm: Plugin của bạn cần nâng cấp lên hỗ trợ null-safety. Bởi vì từ bản flutter 2.12 trở về sau khi tạo dự án sẽ mặc định là có null-safety, thì những dự án này sẽ không thể thêm plugin của bạn nếu bạn có hỗ trợ null-safety

    Công cụ kiểm tra điểm

    Thật là khó chịu khi mà upload plugin xong mới biết bạn được bao nhiêu điểm đúng không?

    Vậy thì sẽ có cách bạn tự kiểm tra trước xem mình được bao nhiêu điểm, và bị mất điểm ở phần nào luôn nha.

    Công cụ đó chính là pana

    Các bạn cài pana vào máy tính bằng dòng lệnh sau:

    pub global activate pana
    

    Sau đó bạn vào terminal của dự án và gõ lệnh:

    flutter pub global run pana
    

    Đây là mình sau khi chạy lệnh được tool báo được chưa hỗ trợ nền tảng web nên chỉ được 110 điểm thôi.

    Kết thúc

    Hi vọng qua bài viết của mình sẽ giúp được các bạn đang gặp khó khăn với việc upload plugin lên pub.dev nha.

    Nguồn tham khảo

    Cảm ơn các bạn đã xem bài viết.

    Tác giả

    Phạm Tiến Dũng [email protected]

  • [Flutter] Hướng dẫn đưa plugin lên pub.dev

    [Flutter] Hướng dẫn đưa plugin lên pub.dev

    [Flutter] Hướng dẫn đưa plugin lên pub.dev

    Giới thiệu

    Ở bài trước mình đã giới thiệu về cách tạo plugin flutter và cách kết nối xuống native (Xem lại tại đây). Hôm nay mình sẽ nói về cách đưa plugin bạn đã viết lên trang chia sẻ của flutter là pub.dev. Cùng bắt đầu thôi nào!

    Lưu ý: Khi bạn đã xuất bản plugin lên pub.dev rồi thì không thể gỡ xuống được nữa. Vậy nên các bạn hãy xuất bản những gói ít nhất là có thể sử dụng được, tránh việc xuất bản chơi/thử nghiệm.

    Chuẩn bị plugin

    Khi xuất bản plugin lên pub.dev sẽ cần có những tiêu chuẩn cần tuân theo:

    • LICENSE: file này mô tả giấy phép cho plugin của bạn, quy định cách người khác sử dụng plugin của bạn như thế nào. Một số giấy phép phổ biến như MIT, Apache, BSD. Bạn có thể tham khảo cách viết một số license tại đây.
    • Dung lượng plugin: dung lượng sau khi nén gzip của bạn phải nhỏ hơn 100MB. Nếu lớn hơn bạn có thể chia ra nhiều plugin hoặc giảm các thành phần không cần thiết trong thư mục example.
    • Phụ thuộc: phần dependencies chỉ được phụ thuộc vào các plugin có sẵn trên pub.dev
    • Tài khoản: bạn cần có 1 tài khoản google đăng nhập sẵn trên pub.dev

    Tệp quan trọng

    Trang pub.dev sẽ dùng 1 số file để tạo nội dung cho plugin của bạn, bạn nên chăm chút các file này để plugin trông đẹp hơn

    • README.md: Đây là file mô tả về nội dung plugin của bạn, cách người khác sử dụng plugin. File này theo định dạng markdown. Bạn có thể tham khảo cách viết README của pub.dev tại đây
    • CHANGELOG.md: File này mô tả sự thay đổi trong plugin của bạn, mỗi khi bạn cập nhật 1 bản mới, bạn cần viết mô tả rõ ràng về sự thay đổi đó. File này cũng định dạng markdown
    • pubspec.yaml: File này điền các thông tin chi tiết của plugin

    name: Tên plugin

    description: Mô tả của gói

    version: phiên bản plugin

    homepage: đường dẫn đến repository git

    Chạy thử nghiệm

    Việc này giúp bạn biết gói của mình đã đủ thông tin chưa, sẽ còn cần bổ sung thêm những gì.

    Gọi lệnh trên terminal:

    dart pub publish --dry-run
    

    hoặc

    flutter packages pub publish --dry-run
    

    Sau khi chạy lệnh, nếu bạn thấy báo Package has 0 warnings. là đã ok rồi.

    Xuất bản

    Khi đã sẵn sàng cho việc xuất bản. Hãy gọi lệnh:

    dart pub publish
    

    hoặc

    flutter packages pub publish
    

    Flutter sẽ hỏi bạn có sẵn sàng để upload chưa, bạn điền y và nhấn Enter.

    Tiếp đến nếu bạn chưa upload lần nào lên pub.dev, terminal sẽ hiện lên 1 link, bạn click vào link này để mở trình duyệt và chọn tài khoản google bạn muốn quản lý thư viện

    Sau đó bạn trở về đợi terminal báo thành công thôi.

    Sau khi upload thành công thì bạn đợi khoảng 1 tiếng để pub.dev quét plugin của bạn và tính điểm thì plugin của bạn mới được hiển thị với mọi người.

    Kết thúc

    Hi vọng qua bài viết của mình sẽ giúp được các bạn đang gặp khó khăn với việc upload plugin lên pub.dev nha.

    Nguồn tham khảo

    Cảm ơn các bạn đã xem bài viết.

    Tác giả

    Phạm Tiến Dũng [email protected]

  • [Flutter] Hướng dẫn tạo plugin và gọi thư viện native (Phần cuối)

    [Flutter] Hướng dẫn tạo plugin và gọi thư viện native (Phần cuối)

    Xem thêm Phần 1-2 Xem thêm Phần 3

    Phần 4: Hướng dẫn thêm thư viện native

    Trong phần này, mình sẽ demo việc gửi 1 DateTime từ flutter xuống native code để kiểm tra xem có phải ngày hiện tại hay không? Mình sẽ sử dụng thư viện Tempo của tác giả cesarferreira cho Android và SwiftDate của tác giả Daniele Margutti cho iOS.

    Vì flutter và native không giao tiếp với nhau bằng biến loại DateTime được, nên mình sẽ cần chuyển DateTime sang dạng string UTC để xử lý nhé.

    Thêm code flutter để hiển thị kết quả

    Trong file lib/src/sample_call_native.dart các bạn thêm 1 hàm như sau:

      static Future isToday(DateTime dateTime) async {
        final date = dateTime.toUtc().toIso8601String();
        final bool? isSuccess = await _channel.invokeMethod(
          'isToday',
          {
            'dateTime': date,
          },
        );
        return isSuccess;
      }
    

    Trong file example/lib/main.dart bạn đổi lại code như sau:

    import 'package:flutter/material.dart';
    import 'package:sample_plugin_flutter/sample_plugin_flutter.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() =&gt; _MyAppState();
    }
    
    class _MyAppState extends State {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Plugin example app'),
            ),
            body: Center(
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  /// Phần 2. Hướng dẫn tạo Widget với plugin
                  SampleButton(
                    text: "Sample Button",
                    onPressed: () {
                      print("Sample Button Click");
                    },
                  ),
    
                  /// Phần 3. Hướng dẫn gọi native code từ plugin
                  FutureBuilder(
                    future: SampleCallNativeFlutter.platformVersion,
                    builder: (_, snapshoot) {
                      return Text(snapshoot.data ?? '');
                    },
                  ),
    
                  /// Phần 4. Hướng dẫn gọi native code từ plugin
                  FutureBuilder(
                    future: SampleCallNativeFlutter.isToday(DateTime.now()),
                    builder: (_, snapshoot) {
                      return Text('isToDay: ${DateTime.now()} is ${snapshoot.data}');
                    },
                  ),
                  FutureBuilder(
                    future: SampleCallNativeFlutter.isToday(DateTime(2021,01,01)),
                    builder: (_, snapshoot) {
                      return Text('isToDay: ${DateTime(2021,01,01)} is ${snapshoot.data}');
                    },
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    

    Thêm thư viện cho iOS

    Thường khi thêm 1 thư viện vào code iOS, bạn cần sử dụng Cocoapods thêm nó vào Podfile. Nhưng với plugin thì bạn sẽ thêm dependency nó vào ios/sample_plugin_flutter.podspec.

    File này cũng giúp bạn khai báo s.static_framework = true(1 số thư viện native cần phải khai báo biến này) hay s.ios.deployment_target = ‘9.0’ (để giới hạn version build iOS).

    (Nếu bạn chưa biết Cocoapods là gì, bạn có thể tham khảo tại đây)

    #
    # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
    # Run `pod lib lint sample_plugin_flutter.podspec` to validate before publishing.
    #
    Pod::Spec.new do |s|
      s.name             = 'sample_plugin_flutter'
      s.version          = '0.0.1'
      s.summary          = 'A new flutter plugin project.'
      s.description      = &lt; '../LICENSE' }
      s.author           = { 'Your Company' =&gt; '[email protected]' }
      s.source           = { :path =&gt; '.' }
      s.source_files = 'Classes/**/*'
      s.dependency 'Flutter'
      s.dependency 'SwiftDate' # Khai báo thư viện iOS tại đây
      s.platform = :ios, '8.0'
    
      # Flutter.framework does not contain a i386 slice.
      s.pod_target_xcconfig = { 'DEFINES_MODULE' =&gt; 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' =&gt; 'i386' }
      s.swift_version = '5.0'
    end
    

    Sau đó bạn cần chạy pod install cho thư mục example/ios và vào Xcode chọn menu Product/Clean Build Folder. Trong file SwiftSamplePluginFlutterPlugin bạn đổi lại code như sau:

    import Flutter
    import UIKit
    import SwiftDate
    
    public class SwiftSamplePluginFlutterPlugin: NSObject, FlutterPlugin {
      public static func register(with registrar: FlutterPluginRegistrar) {
        let channel = FlutterMethodChannel(name: "sample_plugin_flutter", binaryMessenger: registrar.messenger())
        let instance = SwiftSamplePluginFlutterPlugin()
        registrar.addMethodCallDelegate(instance, channel: channel)
      }
    
      public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        switch call.method {
        case "getPlatformVersion":
            result("iOS " + UIDevice.current.systemVersion)
        case "isToday":
            isToday(call, result)
        default:
            result(nil)
        }
      }
        
        private func isToday(_ call: FlutterMethodCall,_ result: @escaping FlutterResult) {
            let arguments = call.arguments as! Dictionary
            let dateTime = arguments["dateTime"] as! String;
            // Convert to local
            let localDate = dateTime.toDate(nil, region: Region.current)
            // Check isToday
            let checkToday = localDate?.isToday
            result(checkToday)
        }
    }
    

    Thế là xong bên iOS, giờ qua phần của Android.

    Thêm thư viện cho Android

    Trong Gradle Scripts/build.gradle(Module: android.sample_plugin_flutter) bạn thêm dòng bên dưới ở cuối file và nhấn Sync now

    dependencies {
      implementation 'com.github.cesarferreira:tempo:+'
    }
    

    Sample 5

    Trong file android/src/main/kotlin/com/example/sample_plugin_flutter/SamplePluginFlutterPlugin.kt bạn đổi lại code như sau:

    package com.example.sample_plugin_flutter
    
    import androidx.annotation.NonNull
    import com.cesarferreira.tempo.Tempo
    import com.cesarferreira.tempo.isToday
    
    import io.flutter.embedding.engine.plugins.FlutterPlugin
    import io.flutter.plugin.common.MethodCall
    import io.flutter.plugin.common.MethodChannel
    import io.flutter.plugin.common.MethodChannel.MethodCallHandler
    import io.flutter.plugin.common.MethodChannel.Result
    import java.text.SimpleDateFormat
    import java.util.*
    
    /** SamplePluginFlutterPlugin */
    class SamplePluginFlutterPlugin: FlutterPlugin, MethodCallHandler {
      /// The MethodChannel that will the communication between Flutter and native Android
      ///
      /// This local reference serves to register the plugin with the Flutter Engine and unregister it
      /// when the Flutter Engine is detached from the Activity
      private lateinit var channel : MethodChannel
    
      override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
        channel = MethodChannel(flutterPluginBinding.binaryMessenger, "sample_plugin_flutter")
        channel.setMethodCallHandler(this)
      }
    
      override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
        when (call.method) {
          "getPlatformVersion" -&gt; result.success("Android ${android.os.Build.VERSION.RELEASE}")
          "isToday" -&gt; isToday(call, result)
          else -&gt; {
            result.notImplemented()
          }
        }
      }
    
      private fun isToday(@NonNull call: MethodCall, @NonNull result: Result) {
        var arguments = call.arguments as Map
        var dateTime = arguments["dateTime"] as String
        var localDate = dateTime.toDate()
        var checkToday = localDate.isToday // library Tempo check isToday
        result.success(checkToday)
      }
    
      private fun String.toDate(dateFormat: String = "yyyy-MM-dd'T'HH:mm:ss", timeZone: TimeZone = TimeZone.getTimeZone("UTC")): Date {
        val parser = SimpleDateFormat(dateFormat, Locale.getDefault())
        parser.timeZone = timeZone
        return parser.parse(this)
      }
    
      override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
        channel.setMethodCallHandler(null)
      }
    }
    

    Xong rồi, giờ chạy flutter run để xem thành quả cuối cùng thôi nào.

    Sample 6

    Kết thúc

    Hi vọng qua bài viết của mình giúp ích cho các bạn phần nào việc làm qua viết plugin cho Flutter. Mình để link Github ở đây để các bạn tham khảo nha.

    Nguồn tham khảo:

    Bài viết đầy đủ tại Viblo Cảm ơn các bạn đã xem bài viết.

    Tác giả

    Phạm Tiến Dũng [email protected]

  • [Flutter] Hướng dẫn tạo plugin và gọi thư viện native (Phần 3)

    [Flutter] Hướng dẫn tạo plugin và gọi thư viện native (Phần 3)

    Xem lại Phần 1-2

    Phần 3. Hướng dẫn gọi native code từ plugin

    1. Làm việc với IDE native

    Khi làm việc với native code, bạn nên dùng Android Studio khi code Android và Xcode khi code iOS nhé. 2 IDE này sẽ hỗ trợ bạn tốt hơn trong việc báo lỗi và cả debug code.

    • Trong Android Studio bạn mở thư mục example/android/, giao diện cây thư mục trong IDE sẽ như thế này. Sample 2

    • Trong Xcode bạn mở thư mục example/ios/Runner.xcworkspace, giao diện cây thư mục trong IDE sẽ như thế này. Sample 3

    2. Code native cho plugin

    Để gọi native code, bạn sẽ cần sử dụng channel, thường channel nên được đặt cùng tên với tên plugin của bạn. Thông qua channel chúng ta sẽ gọi hàm native và nhận kết quả từ đó.

    Các bạn có thể tham khảo mapping các loại biến giữa các nền tảng tại đây.

    Trong thư mục lib/src các bạn tạo 1 file dart mới và đặt tên là sample_call_native.dart. File này sẽ tạo MethodChannel(‘sample_plugin_flutter’) để liên kết đến native code và hàm platformVersion() để kiểm tra version của thiết bị người dùng.

    import 'dart:async';
    
    import 'package:flutter/services.dart';
    
    class SampleCallNativeFlutter {
      static const MethodChannel _channel =
          const MethodChannel('sample_plugin_flutter');
    
      static Future get platformVersion async {
        final String? version = await _channel.invokeMethod('getPlatformVersion');
        return version;
      }
    }
    

    Trong file lib/src/src.dart các bạn thêm dòng export.

    export 'sample_call_native.dart';
    

    Trong file android/src/main/kotlin/com/example/sample_plugin_flutter/SamplePluginFlutterPlugin.kt đã code demo sẵn channel và cách trả về platformVersion như minh họa phía dưới. Tại hàm onMethodCall, cần kiểm tra tên call.method được gọi là gì và trả về cho flutter kết quả thông qua result.success().

    Lưu ý: nếu bạn gọi 1 function không cần trả kết quả, bạn vẫn phải gọi result.success(null) để báo về cho flutter biết hàm đã thực hiện xong.

    package com.example.sample_plugin_flutter
    
    import androidx.annotation.NonNull
    
    import io.flutter.embedding.engine.plugins.FlutterPlugin
    import io.flutter.plugin.common.MethodCall
    import io.flutter.plugin.common.MethodChannel
    import io.flutter.plugin.common.MethodChannel.MethodCallHandler
    import io.flutter.plugin.common.MethodChannel.Result
    
    /** SamplePluginFlutterPlugin */
    class SamplePluginFlutterPlugin: FlutterPlugin, MethodCallHandler {
      /// The MethodChannel that will the communication between Flutter and native Android
      ///
      /// This local reference serves to register the plugin with the Flutter Engine and unregister it
      /// when the Flutter Engine is detached from the Activity
      private lateinit var channel : MethodChannel
    
      override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
        channel = MethodChannel(flutterPluginBinding.binaryMessenger, "sample_plugin_flutter")
        channel.setMethodCallHandler(this)
      }
    
      override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
        when (call.method) {
          "getPlatformVersion" -&gt; result.success("Android ${android.os.Build.VERSION.RELEASE}")
          else -&gt; {
            result.notImplemented()
          }
        }
      }
    
      override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
        channel.setMethodCallHandler(null)
      }
    }
    
    

    Tương tự trong file ios/Classes/SwiftSamplePluginFlutterPlugin.swift đã code demo sẵn channel và cách trả về platformVersion như minh họa phía dưới. Tại hàm handle, cần kiểm tra tên call.method được gọi là gì và trả về cho flutter kết quả thông qua result(). Nếu bạn gọi 1 function không cần trả kết quả, bạn vẫn cần gọi result(nil) để báo về cho flutter biết hàm đã thực hiện xong.

    import Flutter
    import UIKit
    
    public class SwiftSamplePluginFlutterPlugin: NSObject, FlutterPlugin {
      public static func register(with registrar: FlutterPluginRegistrar) {
        let channel = FlutterMethodChannel(name: "sample_plugin_flutter", binaryMessenger: registrar.messenger())
        let instance = SwiftSamplePluginFlutterPlugin()
        registrar.addMethodCallDelegate(instance, channel: channel)
      }
    
      public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        switch call.method {
        case "getPlatformVersion":
            result("iOS " + UIDevice.current.systemVersion)
        default:
            result(nil)
        }
      }
    }
    

    Trong file example/lib/main.dart bạn đổi lại code như sau:

    import 'package:flutter/material.dart';
    import 'package:sample_plugin_flutter/sample_plugin_flutter.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() =&gt; _MyAppState();
    }
    
    class _MyAppState extends State {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Plugin example app'),
            ),
            body: Center(
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  /// Phần 2. Hướng dẫn tạo Widget với plugin
                  SampleButton(
                    text: "Sample Button",
                    onPressed: () {
                      print("Sample Button Click");
                    },
                  ),
    
                  /// Phần 3. Hướng dẫn gọi native code từ plugin
                  FutureBuilder(
                    future: SampleCallNativeFlutter.platformVersion,
                    builder: (_, snapshoot) {
                      return Text(snapshoot.data ?? '');
                    },
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    

    Chạy flutter run để xem kết quả thôi nào.

    Sample 4

    Còn tiếp

    Bài viết đầy đủ tại Viblo

  • [Flutter] Hướng dẫn tạo plugin và gọi thư viện native

    [Flutter] Hướng dẫn tạo plugin và gọi thư viện native

    Giới thiệu

    Hiện nay tài liệu cho việc tạo plugin cho flutter khá ít, mà tài liệu để plugin gọi xuống các thư viện native càng hiếm hơn nữa. Nên hôm nay mình viết bài này để giúp mọi người dễ dàng hơn trong việc viết plugin với flutter. Cùng bắt đầu thôi nào!

    Phần 1. Hướng dẫn tạo plugin

    Để tạo 1 plugin bạn cần dùng lệnh flutter create –template=plugin

    • Sử dụng tùy chọn –platforms để chỉ định plugin sẽ có những ngôn ngữ nào. Có các tùy chọn như: android, ios, web, linux, macos, windows
    • Sử dụng tùy chọn –org để chỉ định tên miền cho tổ chức của bạn
    • Sử dụng tùy chọn –a để chỉ định ngôn ngữ cho android. Bạn có thể chọn java hoặc kotlin
    • Sử dụng tùy chọn –i để chỉ định ngôn ngữ cho ios. Bạn có thể chọn swift hoặc objc
    • Và cuối cùng sẽ là tên plugin của bạn

    Tham khảo:

    flutter create --org com.example --template=plugin --platforms=android,ios -a kotlin -i swift sample_plugin_flutter
    

    Sau khi thao tác trên bạn sẽ có 1 plugin trong thư mục sample_plugin_flutter với một số file cơ bản sau:

    • lib/sample_plugin_flutter.dart => API Dart cho plugin. File này dùng để kết nối các thành phần của plugin, kết nối với native code
    • android/src/main/kotlin/com/example/sample_plugin_flutter/SamplePluginFlutterPlugin.kt => Triển khai API plugin trong Kotlin dành riêng cho nền tảng Android.
    • ios/Classes/SwiftSamplePluginFlutterPlugin.swift => Triển khai API plugin trong Swift dành riêng cho nền tảng iOS.
    • example/ => Một ứng dụng Flutter phụ thuộc vào plugin và minh họa cách sử dụng nó.
    • lib/src/ => Thư mục này sẽ không có sẵn, nhưng bạn cần tạo thư mục này để chứa các file private. Bạn chỉ public các file cần thiết thông qua khai báo export trong lib/sample_plugin_flutter.dart

    Phần 2. Hướng dẫn tạo Widget với plugin

    Để tạo Widget hay Function để người dùng plugin để thể gọi và sử dụng, bạn cần đưa file đó vào thư mục src và export nó ra ngoài. Khi làm vậy, người dùng chỉ cần import 1 dòng duy nhất là có thể sử dụng plugin của bạn.

    Trong thư mục lib/src các bạn tạo 1 file dart mới và đặt tên là sample_button.dart

    import 'package:flutter/material.dart';
    
    class SampleButton extends StatelessWidget {
      final String text;
      final VoidCallback? onPressed;
    
      const SampleButton({
        Key? key,
        required this.text,
        this.onPressed,
      }) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return TextButton(
          onPressed: onPressed,
          child: Container(
            padding: EdgeInsets.all(16),
            decoration: BoxDecoration(
              color: Colors.blue,
              borderRadius: BorderRadius.circular(10),
            ),
            child: Text(
              text,
              style: TextStyle(
                color: Colors.white,
                fontWeight: FontWeight.bold,
              ),
            ),
          ),
        );
      }
    }
    

    Trong thư mục lib/src các bạn tạo thêm file src.dart, file này sẽ chứa tất cả file mà bạn muốn export ra ngoài.

    export 'sample_button.dart';
    

    Trong file lib/sample_plugin_flutter.dart bạn nên xóa hết code mặc định đi. File này các bạn sẽ chứa những file bạn muốn export hoặc export những plugin khác có trong dependence của bạn.

    export 'src/src.dart';
    

    Giờ thì thử build Widget này lên từ app example nhé. Trong file example/lib/main.dart bạn đổi lại code như sau:

    import 'package:flutter/material.dart';
    import 'package:sample_plugin_flutter/sample_plugin_flutter.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() =&gt; _MyAppState();
    }
    
    class _MyAppState extends State {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Plugin example app'),
            ),
            body: Center(
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  /// Phần 2. Hướng dẫn tạo Widget với plugin
                  SampleButton(
                    text: "Sample Button",
                    onPressed: () {
                      print("Sample Button Click");
                    },
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    

    Chạy flutter run để xem kết quả thôi nào.

    Sample 1

    Còn tiếp

    Bài viết đầy đủ tại Viblo