月度归档: 2020 年 1 月

  • Flutter中的IoC

    因为长期做后端开发,Spring提供的IoC功能确实用的很多。到了Flutter中各种依赖项目的管理也很麻烦,也影响单元测试的编写。

    所以在Flutter还是希望延续平时的习惯,使用IoC去控制依赖等关系。但是Flutter中有一些特殊的情况,比如Flutter禁用了dart:mirrors,反射的使用上有一些问题。对比了几个框架,最开始考虑的是Google下面的inject.dart,但是文档这块比较缺,还有就是注解+代码生成的方式强大,但是不是很喜欢,也用不了这么强的功能。由于名字的原因也看了下ioc库(https://pub.dev/packages/ioc),对于API的语法不是很喜欢。最后选择使用GetIt。

    使用上比较简单,引用依赖

    dependencies:
      get_it: ^3.1.0

    代码中专门配置一个方法用于管理所有依赖配置

    class IocConfiguration {
      configDependencies(
          {AnalysisService analysisService}) {
        var loader = GetIt.I;
    
        loader
            .registerLazySingleton<LoggingService((() =SimpleLoggingService()));
    
        if (analysisService != null) {
          loader.registerLazySingleton<AnalysisService((() =analysisService));
        } else {
          loader.registerLazySingleton<AnalysisService(
              (() 
  • Flutter快速构建设置界面

    Flutter快速构建设置界面

    设置(settings)一般是指用于配置App相关内容,看图比较直观

    对于设置界面的子项目来说一般有几种常见的类型

    • 输入类型(如展示的用户名)
    • 勾选类型(如是否允许后台推送)
    • 滑动设置(如音量大小)
    • 选项(如缓冲策略等)

    shared_preferences_settings提供了常用的选项和UI,同时设置结果持久化在shared_prefrences中,可以快速构建设置页面。

    在依赖中加入

    shared_preferences_settings:
        git:
          url: https://github.com/BarthaBRW/shared_preferences_settings.git
          ref: 9857951c728bd23df27995ef92da4e489a072f8c
      shared_preferences: ^0.5.6

    这里有个比较坑的地方就是shared_preferences_settings目前只在pub.dev发布了一个旧版本,旧版本依赖的shared_preferences比较老,对于AndroidX支持有问题,所以只有直接用依赖git的方式加入依赖,这里指定ref防止一些不稳定问题。

    使用方式比较简单

    import 'package:fish_redux/fish_redux.dart';
    import 'package:flutter/material.dart';
    import 'package:kiwi/domain/constant/settings_key.dart';
    import 'package:kiwi/domain/enum/js_engine_type.dart';
    import 'package:shared_preferences_settings/shared_preferences_settings.dart';
    
    import 'state.dart';
    
    Widget buildView(
        SettingsState state, Dispatch dispatch, ViewService viewService) 
  • 使用Github Action自动merge pull request

    Github提供了pull request功能,有时候在小团队开发或者个人仓库的时候,基于git分支策略,可能依然需要在feature分支开发,但是需要经常合并到master。

    这种情况下更偏好于PR能够自动merge,而不是等CI等自动检查通过后再点击merge按钮。

    Github Action可以在创建pull request的时候触发,从而自动完成这个过程。相关配置如下:

    name: Automerge
    on:
      pull_request:
        types:
          - labeled
          - unlabeled
          - synchronize
          - opened
          - edited
          - ready_for_review
          - reopened
          - unlocked
      pull_request_review:
        types:
          - submitted
      status: {}
    jobs:
      automerge:
        runs-on: ubuntu-latest
        steps:
          - name: 
  • Flutter打包后闪退问题

    最近在搞Flutter,在模拟器调试一切正常,但是flutter build apk以后真机闪退,看了下日志,报错如下:

    E/flutter ( 5319): [ERROR:flutter/shell/platform/android/platform_view_android_jni.cc(39)] java.lang.NoClassDefFoundError: g.a.b.o3
    E/flutter ( 5319): 	at g.a.b.r.v(Unknown Source:0)
    E/flutter ( 5319): 	at com.huangyunkun.kiwi.a.a(Unknown Source:102)
    E/flutter ( 5319): 	at com.huangyunkun.kiwi.MainActivity$a.a(Unknown Source:153)
    E/flutter ( 5319): 	at c.a.c.a.j$a.a(Unknown Source:17)
    E/flutter ( 5319): 	at io.flutter.embedding.engine.e.b.a(Unknown Source:57)
    E/flutter 
  • 使用Github Action发布函数到阿里云serverless平台

    使用Github Action发布函数到阿里云serverless平台

    本文首发于:https://developer.aliyun.com/article/741408 修改后发于本博客

    阿里云提供了函数计算,即serverless支持。同时阿里云还提供了fun cli命令行工具方便项目验证、发布等。发布函数虽然只是一句命令行的事情,但是做到集成发布平台还是需要准备对应的环境,配置和工具的。

    travis-ci可以用shell脚本完成,但是要求nodejs环境。在从travis-ci切换到Github Action的时候还需要重新写shell脚本,但是Github Action支持Dockerfile模式,可以使用更简单的方式来实现,同时更有利于复用。

    Github Action支持自定义,主要有两个方法,第一种是javascript路线(nodejs环境),第二种是dockerfile路线,支持直接run docker镜像。第二种使用覆盖面更广和容易,特别是我对nodejs的调试一直比较困难。

    我们要构建的这个Github Action思路很简单,提供一个node环境,预安装fun的稳定版本,然后直接运行fun deploy就行了。所有需要的参数要么通过ENV传递,要么通过input传递。

    自定义Github Action

    自定义的几个主要步骤如下:

    • 创建action.yml文件
    • 创建Dockerfile和必要的其他文件,比如entrypoint.sh
    • 创建README (发布到marketplace必要)

    首先创建一个action.yml文件,这个文件的内容会展示到github action marketplace中。

    示例如下:

    name: "Aliyun Serverless Action"
    description: "GitHub Actions for Aliyun Serverless 🚀 Deploy function automatically."
    author: