- Flutter 教程
- Flutter - 首頁
- Flutter - 簡介
- Flutter - 安裝
- 在 Android Studio 中建立簡單的應用程式
- Flutter - 架構應用程式
- Dart 程式設計簡介
- Flutter - Widget 簡介
- Flutter - 佈局簡介
- Flutter - 手勢簡介
- Flutter - 狀態管理
- Flutter - 動畫
- Flutter - 編寫 Android 特定程式碼
- Flutter - 編寫 iOS 特定程式碼
- Flutter - 包簡介
- Flutter - 訪問 REST API
- Flutter - 資料庫概念
- Flutter - 國際化
- Flutter - 測試
- Flutter - 部署
- Flutter - 開發工具
- Flutter - 編寫高階應用程式
- Flutter - 結論
- Flutter 有用資源
- Flutter - 快速指南
- Flutter - 有用資源
- Flutter - 討論
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 包警報,如下所示:
可以使用選單選項在 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 外掛選擇視窗,如下所示:
輸入 my_browser 作為專案名稱,然後單擊下一步。
在視窗中輸入外掛名稱和其他詳細資訊,如下所示:
在下面的視窗中輸入公司域名 flutterplugins.tutorialspoint.com,然後單擊完成。它將生成啟動程式碼來開發我們的新外掛。
開啟 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 將從網際網路獲取包併為應用程式正確配置它。
開啟 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"),
),
),
);
}
}
執行應用程式並單擊“開啟瀏覽器”按鈕,您將看到瀏覽器啟動。您將看到瀏覽器應用程式 - 首頁,如下面的螢幕截圖所示:
您將看到瀏覽器應用程式 – 瀏覽器螢幕,如下面的螢幕截圖所示: