share facebook facebook twitter menu hatena pocket slack

2019.07.01 MON

Flutter Web: Tips集

松本 勝年

WRITTEN BY 松本 勝年

最近Flutter Webを利用しています。
調べないとうまくいかなかった事がいくつかあったので、書き残しておきます。

Flutter Webに限定した記事です(iOSやAndroidは考慮していません)

画像を表示したい

web/assets/ 配下に画像を配置します。

web/assets/icons/sample.pngに配置した場合は

Image sample = Image.asset('icons/sample.png');

で利用できるようになります。

別のサーバにある画像の場合は

Image sample = Image.network('https://xxx.com/sample.png')

で利用できます。

マテリアルアイコンを表示したい

マテリアルアイコンを使いたい場合はIconsクラスの定数を指定する事で利用できると、公式ドキュメントに書かれてます。
利用手順も書かれていますが、これだと利用できません。

こうなる

こうしたい

web/assets/FontManifest.jsonMaterialIcons フォントを設定してください。
Flutter Webでマテリアルアイコンが表示されないとき
で利用できるようになります。

カスタムフォントを利用したい

web/assets/fonts/sample.otf 配下に保存した場合、
web/assets/FontManifest.json に利用したいフォントを記載します。

[
    {
        "family": "sample",
        "fonts": [
            {
                "asset": "fonts/sample.otf"
            }
        ]
    }
]

FontFamilyとして sample が利用できるようになるので、
このように記述すればカスタムフォントが適用されます。

Text("hoge", style: TextStyle(fontFamily: 'sample'))

絵文字を表示したい

😁:grin: はUnicodeで 1F601 なので、

Text("\u{1F601}")

で表示できます。

:woman-lifting-weights: はこう

Text("\u{1F3CB}\u{FE0F}\u{200D}\u{2640}\u{FE0F}")

参考)
Special characters in Flutter
Slackの絵文字を全て取得する

アプリの背景全体をグラデーションさせたい

左のようなデフォルトのマテリアルデザインの配色から、背景全体をグラデーションさせたい場合、

こんな感じでテーマとコンテナを設定すると実現できます。

import 'package:flutter_web/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        scaffoldBackgroundColor: Colors.transparent,
        appBarTheme: AppBarTheme(
          elevation: 0.0,
          color: Colors.transparent,
        ),
      ),
      home: Container(
        decoration: BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.centerLeft,
            end: Alignment.topRight,
            colors: [ Colors.red, Colors.lightGreenAccent,],
          )
        ),
        child: Scaffold(
          appBar: AppBar(
            title: Text('Flutter Demo Home Page'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text('Hello, World!',),
              ],
            ),
          ),
        )
      ),
    );
  }
}

デフォルトとの差分はこんな感じになります。

参考) Flutter: wrapping Scaffold with Container for gradient background

APIレスポンスの日本語が文字化けする

レスポンスの body ではなく bodyBytesを利用すると解消できます。

import 'package:http/http.dart' as http;
import 'dart:convert' show utf8;

main() {
  http.Response response = await http.get('https://xxxx.com/users');

  if ( response.statusCode == 200 ) {
    return json.decode(utf8.decode(response.bodyBytes));
  }
}

参考) Dartのhttpパッケージで文字化け

OSを判別したい

スマホ向けだとこんな感じの記述で実現できるらしいのですが、

import 'dart:io' show Platform;

main(){
  if (Platform.isWindows) {
    print('is a Windows');
  } else {
    print('is not a Windows');
  }
}

Flutter Webだと使えない様子でした。

仕方がないので、 dart:html を使って判別しました。

import 'dart:html';

main(){
  if (window.navigator.platform.contains('Win')) {
    print('is a Windows');
  } else {
    print('is not a Windows');
  }
}

元記事はこちら

Flutter Web: Tips集

松本 勝年

松本 勝年

フロントエンドに興味があるエンジニア

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。