i++

プログラム系のメモ書きなど

Android : No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android

少し古い Flutter のアプリをビルドしようとしたところ発生。build.gradle の

classpath 'com.android.tools.build:gradle:3.0.1'

となっていた箇所を 3.2.0 に変えたら、このエラーは解消したものの以下の別のエラーが出現。

* What went wrong:
A problem occurred evaluating project ':app'.
> Failed to apply plugin [id 'com.android.application']
   > Minimum supported Gradle version is 4.6. Current version is 4.1. If using the gradle wrapper, try editing the distributionUrl in <プロジェクトのディレクトリ>\android\gradle\wrapper\gradle-wrapper.properties to gradle-4.6-all.zip

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD FAILED in 1m 16s

Finished with error: Please review your Gradle project setup in the android/ folder.

指示に従い、gradle-wrapper.properties で gradle-4.6-all.zip を使うように修正したところ、ビルドが通るようになりました(いくつかの「registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)」というメッセージは残ったまま)。


参考:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android · Issue #22031 · flutter/flutter · GitHub

flutter : Android で action_send (共有) intent を使う

share | Flutter Package を使います。

android_intent | Flutter Package を使って action パラメータに action_send を設定すればよいかと思ったのですが、上手くいきませんでした。詳しく調べていないので上手くやる方法はあるのかもしれません(多分ありそうです)。

Flutter : PullToRefresh の実装

flutter/overscroll_demo.dart at master · flutter/flutter · GitHub を参考にする。

要点は

  • RefreshIndicator を使う。
    • child に ListView.Builder を設定する。
    • onRefresh に、更新が終わったら complete する Future を返す関数を設定する。これが Pull したときに呼ばれる。
    • key に GlobalKey() を設定する。
      • Pull 以外の箇所(ボタン押しなど)で state の .currentState.show() を呼び出すと onRefresh に設定した関数が呼ばれる。

Dart : DateTime の parse/format

intl パッケージの DateFormat クラスを使う。

import 'package:intl/intl.dart';
// パース
var format = DateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var date = format.parse('Tue, 18 Sep 2018 11:30:15 +0000');

Flutter : MissingPluginException(No implementation found for method close on channel flutter_webview_plugin)

Flutter で webview の plugin (flutter_webview_plugin) を使用し、hot reload が反映されて WebView を表示しようとしたところタイトルのエラーが発生(Androidエミューレーター上での実行)。

以下の記事によると「リビルド(クリーン)」したら直ったとのこと。一回実行を停止してから再開したら直りました。

MissingPluginException(No implementation found for method close on channel flutter_webview_plugin) · Issue #33 · fluttercommunity/flutter_webview_plugin · GitHub

他のパッケージを入れたときも似たようなエラーが発生したので、新しいパッケージを入れたときやパッケージを更新したときは再実行が必要な模様。

golang : template で変数を利用した前後のスペース、改行をなくす

go の text/template パッケージの Text and Spaces に書かれているとおり、前のスペースをなくすには {{- を、後ろのスペースをなくすには -}} のように - をつける(アクセスする変数と - の間のスペースは必須で、括弧と - の間にスペースはいれてはいけない)。

template 中、range でスライスやマップをループするときの出力調整などに。

この方法はスペースと改行を区別せず、連続している空白を全て消すことに注意。

{{ range $ }}
    {{ . }}
{{ end }}

のような - のないテンプレートに要素が "A", "B", "C" というスライスを与えて実行すると

    A

    B

    C

という出力になり、テンプレートを

{{ range $ -}}
    {{ . }}
{{ end -}}

のように変えると

A
B
C

になる(range $ -}}- が、同じ行の後ろに続く改行だけでなく次の行の {{.}} の前のスペースも消している)。