教程 > flutter 教程 > 阅读:43

flutter 包介绍——迹忆客-ag捕鱼王app官网

dart 组织和共享一组功能的方式是通过 package。 dart 包只是可共享的库或模块。 一般来说,dart package 与 dart application 的相同,只是 dart package 没有应用程序入口点 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 是 fl​​utter 的自定义路由器。这取决于 flutter 框架。

flutter 插件

通用 dart 代码,依赖于 flutter 框架以及底层平台代码(android sdk 或 ios sdk)。例如,相机是一个与设备相机交互的插件。它依赖于 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 包警报,如下所示

flutter package alert

可以使用菜单选项在 android studio 中安装或更新 dart 包。

使用如下所示的命令导入必要的文件并开始工作 -

import 'package:english_words/english_words.dart';

使用包中可用的任何方法,

nouns.take(50).foreach(print);

在这里,我们使用了名词函数来获取和打印前 50 个单词。


开发 flutter 插件包

开发 flutter 插件类似于开发 dart 应用程序或 dart 包。唯一的例外是插件将使用系统 api(android 或 ios)来获得所需的平台特定功能。

由于我们在前面的章节中已经学习了如何访问平台代码,让我们开发一个简单的插件 my_browser 来了解插件开发过程。my_browser 插件的功能是允许应用程序在特定平台的浏览器中打开给定的网站。

启动 android studio。

点击file → new flutter project并选择 flutter plugin 选项。

您可以看到如下所示的 flutter 插件选择窗口 -

flutter plugin

输入 my_browser 作为项目名称,然后单击下一步。

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

配置新的 flutter 插件

在下一步的窗口中输入 company 域 flutterplugins.jiyik.com,然后单击finish。它将生成一个启动代码来开发我们的新插件。

打开 my_browser.dart 文件并编写一个方法 openbrowser 来调用平台特定的 openbrowser 方法。

future openbrowser(string urlstring) async { 
   try {
      final int result = await _channel.invokemethod(
         'openbrowser', { '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;

在这里,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(); 
   } 
}

mybrowserplugin 类中编写平台特定的 openbrowser 方法来访问浏览器。

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 get platformversion async { 
      final string version = await _channel.invokemethod('getplatformversion'); return version; 
   } 
   future openbrowser(string urlstring) async { 
      try {
         final int result = await _channel.invokemethod(
            'openbrowser', {'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 包警报所示 -

flutter android studio package alert

单击获取依赖项选项。android studio 将从 internet 获取包并为应用程序正确配置它。

打开 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 按钮,可以看到浏览器已启动。您可以看到一个浏览器应用程序 - ag捕鱼王app官网主页,如下图所示 -

flutter open browser

我们可以看到一个浏览器应用程序 - 浏览器屏幕,如下图所示

flutter 基础设施

查看笔记

扫码一下
查看教程更方便
网站地图