Flutter - Packages

Flutter - Packages 首页 / Flutter入门教程 / Flutter - Packages

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软件包基本上只是一小部分类似函数的集合,因此可以根据其函数进行分类。

Flutter Package

通用Dart代码,它取决于Flutter框架,并且只能在移动环境中使用,例如,fluro是用于flutter的自定义路由器,这取决于Flutter框架。

Flutter Plugin

通用Dart代码,它取决于Flutter框架以及基础平台代码(Android SDK或iOS SDK)。例如,camera是与设备camera交互的插件。它取决于Flutter框架以及用于访问相机的基础框架。

使用Dart包

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程序包警报,如下所示-

Package Alert
  • 可以使用菜单选项在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插件选择窗口-

Flutter插件
  • 输入my_browser作为项目名称,然后单击"下一步"。

  • 在窗口中输入插件名称和其他详细信息,如下所示-

Configure New Flutter插件
  • 在下面显示的窗口中输入公司域名flutterplugins.learnfk.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类中添加类型为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软件包警告中所示-

Android Studio Package Alert
  • 单击"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"按钮,然后看到浏览器已启动。您可以看到浏览器应用程序-主页,如下面的屏幕图所示-

Open Browser

您可以看到浏览器应用程序–浏览器屏幕,如下面的屏幕截图所示-

Flutter Infrastructure

发布包

成功实现包后,可以将其发布在 pub.dev上,以便任何人都可以在项目中轻松使用它。

发布软件包之前,请确保pubspec.yaml,README.md和CHANGELOG.md文件的内容完整且正确。

接下来,在终端窗口中运行以下命令以分析包的每个阶段。

$ flutter pub publish --dry-run

最后,您需要运行以下命令来发布程序包。

$ flutter pub publish

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

从0开始学游戏开发 -〔蔡能〕

技术管理实战36讲 -〔刘建国〕

玩转webpack -〔程柳锋〕

视觉笔记入门课 -〔高伟〕

A/B测试从0到1 -〔张博伟〕

Redis源码剖析与实战 -〔蒋德钧〕

结构思考力 · 透过结构看思考 -〔李忠秋〕

结构沟通力 -〔李忠秋〕

LangChain 实战课 -〔黄佳〕

好记忆不如烂笔头。留下您的足迹吧 :)