Flutter - 包簡介



Dart 組織和共享一組功能的方式是透過包。Dart 包只是可共享的庫或模組。一般來說,Dart 包與 Dart 應用程式相同,只是 Dart 包沒有應用程式入口點 main。

包的一般結構(考慮一個演示包 my_demo_package)如下:

  • lib/src/* - 私有的 Dart 程式碼檔案。

  • lib/my_demo_package.dart - 主 Dart 程式碼檔案。它可以像這樣匯入到應用程式中:

import 'package:my_demo_package/my_demo_package.dart'
  • 如果需要,其他私有程式碼檔案可以匯出到主程式碼檔案 (my_demo_package.dart) 中,如下所示:

export src/my_private_code.dart
  • lib/* - 任意數量的 Dart 程式碼檔案,可以按任何自定義資料夾結構排列。程式碼可以這樣訪問:

import 'package:my_demo_package/custom_folder/custom_file.dart'
  • pubspec.yaml - 專案規範,與應用程式相同。

包中的所有 Dart 程式碼檔案只是 Dart 類,對於將 Dart 程式碼包含在包中,沒有特殊要求。

包的型別

由於 Dart 包基本上是類似功能的小集合,因此可以根據其功能進行分類。

Dart 包

通用的 Dart 程式碼,可以在 Web 和移動環境中使用。例如,english_words 就是這樣一個包,它包含大約 5000 個單詞,並具有基本的實用程式函式,例如名詞(列出英語中的名詞)、音節(指定單詞中的音節數)。

Flutter 包

通用的 Dart 程式碼,依賴於 Flutter 框架,只能在移動環境中使用。例如,fluro 是 Flutter 的自定義路由器。它依賴於 Flutter 框架。

Flutter 外掛

通用的 Dart 程式碼,依賴於 Flutter 框架以及底層平臺程式碼(Android SDK 或 iOS SDK)。例如,camera 是一個與裝置攝像頭互動的外掛。它依賴於 Flutter 框架以及底層框架來訪問攝像頭。

使用 Dart 包

Dart 包託管並在即時伺服器 https://pub.dartlang.org 上釋出。此外,Flutter 提供了簡單的工具 pub 來管理應用程式中的 Dart 包。使用包所需的步驟如下:

  • 將所需的包名稱和版本包含到 pubspec.yaml 中,如下所示:

dependencies: english_words: ^3.1.5
  • 可以透過檢查線上伺服器找到最新的版本號。

  • 使用以下命令將包安裝到應用程式中:

flutter packages get
  • 在 Android Studio 中開發時,Android Studio 會檢測 pubspec.yaml 中的任何更改,並向開發者顯示 Android Studio 包警報,如下所示:

Package Alert
  • 可以使用選單選項在 Android Studio 中安裝或更新 Dart 包。

  • 使用如下所示的命令匯入必要的檔案並開始工作:

import 'package:english_words/english_words.dart';
  • 使用包中可用的任何方法,

nouns.take(50).forEach(print);
  • 這裡,我們使用 nouns 函式獲取並列印前 50 個單詞。

開發 Flutter 外掛包

開發 Flutter 外掛類似於開發 Dart 應用程式或 Dart 包。唯一的例外是外掛將使用系統 API(Android 或 iOS)來獲取所需的平臺特定功能。

正如我們已經在前面的章節中學習瞭如何訪問平臺程式碼,讓我們開發一個簡單的外掛 my_browser 來理解外掛開發過程。my_browser 外掛的功能是允許應用程式在平臺特定的瀏覽器中開啟給定的網站。

  • 啟動 Android Studio。

  • 單擊檔案 → 新建 Flutter 專案,然後選擇 Flutter 外掛選項。

  • 您將看到一個 Flutter 外掛選擇視窗,如下所示:

Flutter Plugin
  • 輸入 my_browser 作為專案名稱,然後單擊下一步。

  • 在視窗中輸入外掛名稱和其他詳細資訊,如下所示:

Configure New Flutter Plugin
  • 在下面的視窗中輸入公司域名 flutterplugins.tutorialspoint.com,然後單擊完成。它將生成啟動程式碼來開發我們的新外掛。

Package Name
  • 開啟 my_browser.dart 檔案,並編寫一個方法 openBrowser 來呼叫平臺特定的 openBrowser 方法。

Future<void> openBrowser(String urlString) async { 
   try {
      final int result = await _channel.invokeMethod(
         'openBrowser', <String, String>{ 'url': urlString }
      );
   }
   on PlatformException catch (e) { 
      // Unable to open the browser print(e); 
   } 
}
  • 開啟 MyBrowserPlugin.java 檔案並匯入以下類:

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle;
  • 在這裡,我們必須匯入從 Android 開啟瀏覽器所需的庫。

  • 在 MyBrowserPlugin 類中新增新的私有變數 mRegistrar,型別為 Registrar。

private final Registrar mRegistrar;
  • 在這裡,Registrar 用於獲取呼叫程式碼的上下文資訊。

  • 在 MyBrowserPlugin 類中新增一個建構函式來設定 Registrar。

private MyBrowserPlugin(Registrar registrar) { 
   this.mRegistrar = registrar; 
}
  • 更改 registerWith 以在 MyBrowserPlugin 類中包含我們的新建構函式。

public static void registerWith(Registrar registrar) { 
   final MethodChannel channel = new MethodChannel(registrar.messenger(), "my_browser"); 
   MyBrowserPlugin instance = new MyBrowserPlugin(registrar); 
   channel.setMethodCallHandler(instance); 
}
  • 更改 onMethodCall 以在 MyBrowserPlugin 類中包含 openBrowser 方法。

@Override 
public void onMethodCall(MethodCall call, Result result) { 
   String url = call.argument("url");
   if (call.method.equals("getPlatformVersion")) { 
      result.success("Android " + android.os.Build.VERSION.RELEASE); 
   } 
   else if (call.method.equals("openBrowser")) { 
      openBrowser(call, result, url); 
   } else { 
      result.notImplemented(); 
   } 
}
  • 編寫平臺特定的 openBrowser 方法以在 MyBrowserPlugin 類中訪問瀏覽器。

private void openBrowser(MethodCall call, Result result, String url) { 
   Activity activity = mRegistrar.activity(); 
   if (activity == null) {
      result.error("ACTIVITY_NOT_AVAILABLE", 
      "Browser cannot be opened without foreground activity", null); 
      return; 
   } 
   Intent intent = new Intent(Intent.ACTION_VIEW); 
   intent.setData(Uri.parse(url)); 
   activity.startActivity(intent); 
   result.success((Object) true); 
}
  • my_browser 外掛的完整原始碼如下:

my_browser.dart

import 'dart:async'; 
import 'package:flutter/services.dart'; 

class MyBrowser {
   static const MethodChannel _channel = const MethodChannel('my_browser'); 
   static Future<String> get platformVersion async { 
      final String version = await _channel.invokeMethod('getPlatformVersion'); return version; 
   } 
   Future<void> openBrowser(String urlString) async { 
      try {
         final int result = await _channel.invokeMethod(
            'openBrowser', <String, String>{'url': urlString}); 
      } 
      on PlatformException catch (e) { 
         // Unable to open the browser print(e); 
      }
   }
}

MyBrowserPlugin.java

package com.tutorialspoint.flutterplugins.my_browser; 

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 io.flutter.plugin.common.PluginRegistry.Registrar; 
import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 

/** MyBrowserPlugin */ 
public class MyBrowserPlugin implements MethodCallHandler {
   private final Registrar mRegistrar; 
   private MyBrowserPlugin(Registrar registrar) { 
      this.mRegistrar = registrar; 
   } 
   /** Plugin registration. */
   public static void registerWith(Registrar registrar) {
      final MethodChannel channel = new MethodChannel(
         registrar.messenger(), "my_browser"); 
      MyBrowserPlugin instance = new MyBrowserPlugin(registrar); 
      channel.setMethodCallHandler(instance); 
   } 
   @Override 
   public void onMethodCall(MethodCall call, Result result) { 
      String url = call.argument("url"); 
      if (call.method.equals("getPlatformVersion")) { 
         result.success("Android " + android.os.Build.VERSION.RELEASE); 
      } 
      else if (call.method.equals("openBrowser")) { 
         openBrowser(call, result, url); 
      } else { 
         result.notImplemented(); 
      } 
   } 
   private void openBrowser(MethodCall call, Result result, String url) { 
      Activity activity = mRegistrar.activity(); 
      if (activity == null) {
         result.error("ACTIVITY_NOT_AVAILABLE",
            "Browser cannot be opened without foreground activity", null); 
         return; 
      }
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      activity.startActivity(intent); 
      result.success((Object) true); 
   } 
}
  • 建立一個新專案 my_browser_plugin_test 來測試我們新建立的外掛。

  • 開啟 pubspec.yaml 並將 my_browser 設定為外掛依賴項。

dependencies: 
   flutter: 
      sdk: flutter 
   my_browser: 
      path: ../my_browser
  • Android Studio 將提示 pubspec.yaml 已更新,如下所示的 Android Studio 包警報:

Android Studio Package Alert
  • 單擊獲取依賴項選項。Android Studio 將從網際網路獲取包併為應用程式正確配置它。

  • 開啟 main.dart 幷包含 my_browser 外掛,如下所示:

import 'package:my_browser/my_browser.dart';
  • 從 my_browser 外掛呼叫 openBrowser 函式,如下所示:

onPressed: () => MyBrowser().openBrowser("https://flutter.club.tw"),
  • main.dart 的完整程式碼如下:

import 'package:flutter/material.dart'; 
import 'package:my_browser/my_browser.dart'; 

void main() => runApp(MyApp()); 

class MyApp extends StatelessWidget { 
   @override 
   Widget build(BuildContext context) {
      return MaterialApp( 
         title: 'Flutter Demo', 
         theme: ThemeData( 
            primarySwatch: Colors.blue, 
         ), 
         home: MyHomePage(
            title: 'Flutter Demo Home Page'
         ), 
      );,
   }
} 
class MyHomePage extends StatelessWidget { 
   MyHomePage({Key key, this.title}) : super(key: key); 
   final String title; 
   @override 
   Widget build(BuildContext context) {
      return Scaffold(
         appBar: AppBar( 
            title: Text(this.title), 
         ), 
         body: Center(
            child: RaisedButton(
               child: Text('Open Browser'), 
               onPressed: () => MyBrowser().openBrowser("https://flutter.club.tw"), 
            ),
         ), 
      ); 
   }
}
  • 執行應用程式並單擊“開啟瀏覽器”按鈕,您將看到瀏覽器啟動。您將看到瀏覽器應用程式 - 首頁,如下面的螢幕截圖所示:

Open Browser

您將看到瀏覽器應用程式 – 瀏覽器螢幕,如下面的螢幕截圖所示:

Flutter Infrastructure
廣告
© . All rights reserved.