23
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FlutterでFirebase Storageから画像を落として表示するまで

Posted at

Firebase CloudStorageと連携して、画像を落として表示するまでをまとめます。

準備

pubspec.yamlに必要なライブラリを記載します

firebase_storage: ^1.0.4
firebase_core: ^0.2.5+1
cached_network_image: ^0.5.1

これでflutter packages getをしてインストールしましょう

あと、firebaseのstorageで以下の設定をします

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

if request.auth != nullを削除します。後々これだとまずいですが、firebaseの認証も全てつけると面倒なので一旦アクセス可能にしておきます。

firebaseの認証

最初にfirebaseとの接続を行う必要があります。これはfirebase_coreを使いましょう。
それぞれのキーを入れれば利用できます。自分の場合はこの辺知られると恐いので全て外部変数に持たせています。

import 'package:firebase_core/firebase_core.dart';
import 'dart:async';
import 'dart:io';
import '../.env.dart' as env;

Future<FirebaseApp> myFirebaseApp() {
  return FirebaseApp.configure(
    name: env.firebaseName,
    options: FirebaseOptions(
      googleAppID: Platform.isIOS ? env.iosGoogleAppID : env.androidGoogleAppID,
      gcmSenderID: env.gcmSenderID,
      apiKey: env.apiKey,
      projectID: env.projectID,
    ),
  );
}

main.dartでfirebaseとstorageインスタンスの呼び出しを行います。

import 'pages/top_page.dart';
import '.env.dart' as env;
import 'utils/firebase.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_storage/firebase_storage.dart';

void main() async {
  final FirebaseApp app = await myFirebaseApp();
  final FirebaseStorage storage =
      FirebaseStorage(app: app, storageBucket: env.storageBucket);
  runApp(MyApp(storage: storage));
}

class MyApp extends StatelessWidget {
  MyApp({this.storage});
  final FirebaseStorage storage;
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
          primarySwatch: Colors.blue,
          primaryColor: Colors.red,
          accentColor: Colors.yellowAccent),
      home: TopPage(storage: storage),
    );
  }
}

続いて画像の読み込み部分を書きます。URLを読み込んできて、cached_network_imageで画像を表示します。

import 'dart:async';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';

class TopPage extends StatefulWidget {
  TopPage({this.storage});
  final FirebaseStorage storage;

  @override
  _TopPageState createState() => _TopPageState();
}

class _TopPageState extends State<TopPage> {
  GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();
  Image _image;

  Future<void> _downloadFile(String imgPath) async {
    // download path
    StorageReference ref = widget.storage.ref().child('images/$imgPath');
    final String url = await ref.getDownloadURL();
    final img = new Image(image: new CachedNetworkImageProvider(url));

    setState(() {
      _image = img;
    });

    final String name = await ref.getName();
    final String bucket = await ref.getBucket();
    final String path = await ref.getPath();
    print(
      'Success!\n Downloaded $name \n from url: $url @ bucket: $bucket\n '
          'at path: $path',
    );
  }

  @override
  Widget build(BuildContext context) {
    _downloadFile('1.jpeg');
    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        title: const Text('Flutter Storage Example'),
      ),
      body: Center(
        child: Row(
          children: [
            _image,
          ],
        ),
      ),
    );
  }
}

まとめ

クイックでしたが、flutterでfirebaseから画像をダウンロードする方法を書きました。
このあと、twitterみたいにスクロールしていったら逐次的にダウンロードしていく方法も考えたいと思います。

23
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?