Dart 组织和共享一组函数的方式是通过Package包,Dart Package只是可共享的库或模块。通常,Dart包与Dart Application相同,只是Dart Package没有应用程序入口main。
Package的一般结构(考虑一个演示包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代码,它取决于Flutter框架,并且只能在移动环境中使用,例如,fluro是用于flutter的自定义路由器,这取决于Flutter框架。
通用Dart代码,它取决于Flutter框架以及基础平台代码(Android SDK或iOS SDK)。例如,camera是与设备camera交互的插件。它取决于Flutter框架以及用于访问相机的基础框架。
Dart软件包托管并发布到实时服务器https://pub.dartlang.org中,Flutter提供了简单的工具pub来管理应用程序中的Dart包。用作Package所需的步骤如下-
在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);
在这里,无涯教程使用名词函数来获取并打印前50个单词。
开发Flutter插件类似于开发Dart应用程序或Dart程序包,唯一的例外是该插件将使用系统API(Android或iOS)来获取所需的平台特定函数。
正如无涯教程在前面的章节中已经学习了如何访问平台代码一样,让无涯教程开发一个简单的插件my_browser来了解插件的开发过程。 my_browser插件的函数是允许应用程序在平台特定的浏览器中打开给定的网站。
启动Android Studio。
单击 File→New Flutter Project,然后选择Flutter插件选项。
您可以看到如下所示的Flutter插件选择窗口-
输入my_browser作为项目名称,然后单击"下一步"。
在窗口中输入插件名称和其他详细信息,如下所示-
在下面显示的窗口中输入公司域名flutterplugins.learnfk.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类中添加类型为Registrar的新私有变量mRegistrar。
private final Registrar mRegistrar;
在这里,注册器用于获取调用代码的上下文信息。
添加一个构造函数以在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.learnfk.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软件包警告中所示-
单击"Get dependencies"选项, Android studio将从互联网上获取该软件包,并为应用程序正确配置它。
打开main.dart并包含my_browser插件,如下所示-
import 'package:my_browser/my_browser.dart';
从my_browser插件调用openBrowser函数,如下所示-
onPressed: () => MyBrowser().openBrowser("https://flutter.dev"),
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.dev"), ), ), ); } }
运行该应用程序,然后单击"Open Browser"按钮,然后看到浏览器已启动。您可以看到浏览器应用程序-主页,如下面的屏幕图所示-
您可以看到浏览器应用程序–浏览器屏幕,如下面的屏幕截图所示-
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)