Skip to content

FinClip Flutter 运行环境,让小程序在 Flutter 应用中无缝运行 / Flutter DEMO for FinClip

License

Notifications You must be signed in to change notification settings

finogeeks/finclip-flutter-demo

Repository files navigation

FinClip Flutter DEMO

本项目提供在 Flutter 环境中运行小程序的示例 DEMO

👉 https://www.finclip.com/ 👈


🤔 FinClip 是什么?

有没有想过,开发好的微信小程序能放在自己的 APP 里直接运行,只需要开发一次小程序,就能在不同的应用中打开它,是不是很不可思议?

有没有试过,在自己的 APP 中引入一个 SDK ,应用中不仅可以打开小程序,还能自定义小程序接口,修改小程序样式,是不是觉得更不可思议?

这就是 FinClip ,就是有这么多不可思议!

⚙️ Flutter 集成

在项目 pubspec.yaml 文件中添加依赖

mop: latest.version

🖥 示例

import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:io';
import 'package:mop/mop.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    init();
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> init() async {
    if (Platform.isiOS) {
      //com.finogeeks.mopExample
      final res = await Mop.instance.initialize(
          '22LyZEib0gLTQdU3MUauARlLry7JL/2fRpscC9kpGZQA', '1c11d7252c53e0b6',
          apiServer: 'https://api.finclip.com', apiPrefix: '/api/v1/mop');
      print(res);
    } else if (Platform.isAndroid) {
      //com.finogeeks.mopexample
      final res = await Mop.instance.initialize(
          '22LyZEib0gLTQdU3MUauARjmmp6QmYgjGb3uHueys1oA', '98c49f97a031b555',
          apiServer: 'https://api.finclip.com', apiPrefix: '/api/v1/mop');
      print(res);
    }
    if (!mounted) return;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('凡泰极客小程序 Flutter 插件'),
        ),
        body: Center(
          child: Container(
            padding: EdgeInsets.only(
              top: 20,
            ),
            child: Column(
              children: <Widget>[
                Container(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.all(Radius.circular(5)),
                    gradient: LinearGradient(
                      colors: const [Color(0xFF12767e), Color(0xFF0dabb8)],
                      stops: const [0.0, 1.0],
                      begin: Alignment.topCenter,
                      end: Alignment.bottomCenter,
                    ),
                  ),
                  child: FlatButton(
                    onPressed: () {
                      Mop.instance.openApplet('5e3c147a188211000141e9b1');
                    },
                    child: Text(
                      '打开示例小程序',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
                SizedBox(height: 30),
                Container(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.all(Radius.circular(5)),
                    gradient: LinearGradient(
                      colors: const [Color(0xFF12767e), Color(0xFF0dabb8)],
                      stops: const [0.0, 1.0],
                      begin: Alignment.topCenter,
                      end: Alignment.bottomCenter,
                    ),
                  ),
                  child: FlatButton(
                    onPressed: () {
                      Mop.instance.openApplet('5e4d123647edd60001055df1',sequence: 1);
                    },
                    child: Text(
                      '打开官方小程序',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

📘 目录结构

.
├── LICENSE
├── README.md
├── android 安卓工程目录
│   ├── app
│   │   ├── build.gradle  应用构建配置
│   │   └── src
│   │       ├── debug
│   │       │   └── AndroidManifest.xml 应用清单文件
│   │       ├── main 应用源码主目录
│   │       │   ├── AndroidManifest.xml 应用清单文件
│   │       │   ├── java 应用源码目录
│   │       │   │   ├── com
│   │       │   │   │   └── finogeeks
│   │       │   │   │       └── mop_demo
│   │       │   │   │           └── MainActivity.java
│   │       │   │   └── io
│   │       │   │       └── flutter
│   │       │   │           └── plugins
│   │       │   │               └── GeneratedPluginRegistrant.java
│   │       │   └── res 资源文件目录
│   │       │       ├── drawable darwable资源目录
│   │       │       │   └── launch_background.xml
│   │       │       ├── mipmap-hdpi 图片资源目录
│   │       │       │   └── ic_launcher.png
│   │       │       ├── mipmap-mdpi 图片资源目录
│   │       │       │   └── ic_launcher.png
│   │       │       ├── mipmap-xhdpi 图片资源目录
│   │       │       │   └── ic_launcher.png
│   │       │       ├── mipmap-xxhdpi 图片资源目录
│   │       │       │   └── ic_launcher.png
│   │       │       ├── mipmap-xxxhdpi 图片资源目录
│   │       │       │   └── ic_launcher.png
│   │       │       └── values
│   │       │           └── styles.xml
│   │       └── profile
│   │           └── AndroidManifest.xml
│   ├── build.gradle
│   ├── gradle gradle版本配置目录,一般情况下无需关注
│   │   └── wrapper
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── local.properties
│   └── settings.gradle
├── build
├── doc
│   └── mop_flutter_demo.gif
├── ios iOS工程目录
│   ├── Flutter Flutter-SDK目录,一般无需关注
│   │   ├── AppFrameworkInfo.plist
│   │   ├── Debug.xcconfig
│   │   ├── Flutter.framework
│   │   ├── Flutter.podspec
│   │   ├── Generated.xcconfig
│   │   ├── Release.xcconfig
│   │   └── flutter_export_environment.sh
│   ├── Podfile pod依赖配置文件
│   ├── Runner iOS源码主目录
│   │   ├── AppDelegate.h
│   │   ├── AppDelegate.m
│   │   ├── Assets.xcassets 图片资源
│   │   │   ├── AppIcon.appiconset  图标
│   │   │   └── LaunchImage.imageset 启动图
│   │   ├── Base.lproj
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── Main.storyboard
│   │   ├── FATFlutterViewController.h Flutter页面控制器子类
│   │   ├── FATFlutterViewController.m Flutter页面控制器子类
│   │   ├── GeneratedPluginRegistrant.h
│   │   ├── GeneratedPluginRegistrant.m
│   │   ├── Info.plist iOS工程配置文件
│   │   └── main.m
│   └── Runner.xcodeproj
├── lib Flutter源码主目录
│   ├── main.dart 首页
│   └── wx_pay.dart 微信支付源码
├── pubspec.lock
├── pubspec.yaml Flutter配置文件
└── test
    └── widget_test.dart

📋 接口文档

1. 初始化小程序

在使用 SDK 提供的 API 之前必须要初始化 SDK ,初始化 SDK 的接口如下

  ///
  /// initialize mop miniprogram engine.
  /// 初始化小程序
  /// [appkey] is required. it can be getted from api.finclip.com
  /// [secret] is required. it can be getted from api.finclip.com
  /// [apiServer] is optional. the mop server address. default is https://mp.finogeek.com
  /// [apiPrefix] is optional. the mop server prefix. default is /api/v1/mop
  ///
  ///
  Future<Map> initialize(String appkey, String secret,
      {String apiServer, String apiPrefix})

使用示例:

final res = await Mop.instance.initialize(
          '22LyZEib0gLTQdU3MUauARlLry7JL/2fRpscC9kpGZQA', '1c11d7252c53e0b6',
          apiServer: 'https://api.finclip.com', apiPrefix: '/api/v1/mop');

2. 打开小程序

  ///
  /// open the miniprogram [appId] from the  mop server.
  /// 打开小程序
  /// [appId] is required.
  /// [path] is miniprogram open path. example /pages/index/index
  /// [query] is miniprogram query parameters. example key1=value1&key2=value2
  ///
  ///
  Future<Map> openApplet(final String appId,
      {final String path, final String query, final int sequence})

3. 获取当前正在使用的小程序信息

当前小程序信息包括的字段有 appId, name, icon, description, version, thumbnail

  ///
  ///  get current using applet
  ///  获取当前正在使用的小程序信息
  ///  {appId,name,icon,description,version,thumbnail}
  ///
  ///
  Future<Map<String, dynamic>> currentApplet()

4. 关闭当前打开的所有小程序

  ///
  /// close all running applets
  /// 关闭当前打开的所有小程序
  ///
  Future closeAllApplets()

5. 清除缓存的小程序

清除缓存的小程序,当再次打开时,会重新下载小程序

  ///
  /// clear applets cache
  /// 清除缓存的小程序
  ///
  Future clearApplets() 

6. 注册小程序事件处理

当小程序内触发指定事件时,会通知到使用者,比如小程序被转发,小程序需要获取用户信息,注册处理器来做出对应的响应

  ///
  /// register handler to provide custom info or behaviour
  /// 注册小程序事件处理
  ///
  void registerAppletHandler(AppletHandler handler) 

处理器的结构

abstract class AppletHandler {
  ///
  /// 转发小程序
  ///
  ///
  ///
  void forwardApplet(Map<String, dynamic> appletInfo);

  ///
  ///获取用户信息
  ///  "userId"
  ///  "nickName"
  ///  "avatarUrl"
  ///  "jwt"
  ///  "accessToken"
  ///
  Future<Map<String, dynamic>> getUserInfo();

  /// 获取自定义菜单
  Future<List<CustomMenu>> getCustomMenus(String appId);

  ///自定义菜单点击处理
  Future onCustomMenuClick(String appId, int menuId);
}

7. 注册扩展 API

如果,我们的小程序 SDK API 不满足您的需求,您可以注册自定义的小程序API,然后就可以在小程序内调用自已定义的 API 了。

  ///
  /// register extension api
  /// 注册扩展api
  ///
  void registerExtensionApi(String name, ExtensionApiHandler handler)

iOS 需要在小程序根目录创建 FinChatConf.js 文件,配置实例如下

module.exports = {
  extApi:[
    { //普通交互API
      name: 'onCustomEvent', //扩展api名 该api必须Native方实现了
      params: { //扩展api 的参数格式,可以只列必须的属性
        url: ''
      }
    }
  ]
}

📘 目录结构

.
├─.github
│          
├─.vscode
│      
├─android 工程Android源码   
│      
├─ios 工程iOS源码
│          
├─lib 工程Flutter源码
│  │
│  ├─ main.dart 程序入口,以及各初始化、调用示例
│  │
│  └─ wx_pay.dart 微信支付类示例
│
├─test 测试目录,无需关注
│      
└─pubspec.yaml Flutter工程配置项

🔗 常用链接

以下内容是您在 FinClip 进行开发与体验时,常见的问题与指引信息

☎️ 联系我们

微信扫描下面二维码,关注官方公众号 「凡泰极客」,获取更多精彩内容。

微信扫描下面二维码,加入官方微信交流群,获取更多精彩内容。

Stargazers

Stargazers repo roster for @finogeeks/finclip-flutter-demo

Forkers

Forkers repo roster for @finogeeks/finclip-flutter-demo

About

FinClip Flutter 运行环境,让小程序在 Flutter 应用中无缝运行 / Flutter DEMO for FinClip

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published