Flutter Firebase UI集成插件firebase_ui_storage的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter Firebase UI集成插件firebase_ui_storage的使用

Firebase UI Storage

Firebase UI Storage 是一组Flutter小部件和实用工具,旨在帮助您构建和集成与Firebase Storage交互的用户界面。

pub package

文档

问题反馈

请在我们的问题追踪器中提交有关Firebase UI Storage的具体问题、错误或功能请求。

贡献

如果您希望为本仓库中的现有插件贡献更改,请查看我们的贡献指南,并提交一个pull request

示例代码

以下是firebase_ui_storage插件的完整示例代码。这个例子展示了如何使用firebase_ui_storage来创建一个简单的应用程序,该应用程序允许用户上传文件到Firebase Storage,并以列表或网格视图显示存储中的文件。

// Copyright 2023, the Chromium project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:firebase_ui_storage/firebase_ui_storage.dart';
import 'package:flutter/material.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // Initialize Firebase with platform-specific configuration.
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);

  // (Optional) Use Firebase Storage emulator for development and testing.
  await FirebaseStorage.instance.useStorageEmulator('localhost', 9199);

  final storage = FirebaseStorage.instance;

  // Configure Firebase UI Storage with the initialized Firebase Storage instance.
  final config = FirebaseUIStorageConfiguration(
    storage: storage,
  );

  await FirebaseUIStorage.configure(config);

  runApp(const FirebaseUIStorageExample());
}

class FirebaseUIStorageExample extends StatelessWidget {
  const FirebaseUIStorageExample({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'FirebaseUI Storage Example',
      theme: ThemeData(
        primarySwatch: Colors.pink,
        useMaterial3: true,
      ),
      home: const Home(),
    );
  }
}

class Home extends StatefulWidget {
  const Home({super.key});

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  int _selectedIndex = 0;
  GlobalKey key = GlobalKey();

  // Build a list view of items from Firebase Storage.
  Widget buildList() {
    return StorageListView(
      key: key,
      ref: FirebaseStorage.instance.ref('/'),
      itemBuilder: (context, ref) {
        return AspectRatio(
          aspectRatio: 1,
          child: StorageImage(
            ref: ref,
            fit: BoxFit.cover,
          ),
        );
      },
    );
  }

  // Build a grid view of items from Firebase Storage.
  Widget buildGrid() {
    return StorageGridView(
      key: key,
      ref: FirebaseStorage.instance.ref('/'),
      itemBuilder: (context, ref) {
        return AspectRatio(
          aspectRatio: 1,
          child: StorageImage(
            ref: ref,
            fit: BoxFit.cover,
          ),
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('FirebaseUI Storage Example'),
        actions: [
          IconButton(
            icon: const Icon(Icons.refresh),
            onPressed: () {
              setState(() {
                key = GlobalKey();
              });
            },
          ),
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _selectedIndex,
        onTap: (index) => setState(() => _selectedIndex = index),
        items: const [
          BottomNavigationBarItem(
            icon: Icon(Icons.list),
            label: 'List',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.grid_on),
            label: 'Grid',
          ),
        ],
      ),
      body: Column(
        children: [
          Expanded(
            child: switch (_selectedIndex) {
              0 => buildList(),
              1 => buildGrid(),
              _ => throw UnimplementedError(),
            },
          ),
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: Builder(builder: (context) {
              return UploadButton(
                onError: (error, _) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text(error.toString())),
                  );
                },
                onUploadComplete: (ref) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    const SnackBar(content: Text('Upload complete')),
                  );

                  setState(() {
                    key = GlobalKey();
                  });
                },
              );
            }),
          )
        ],
      ),
    );
  }
}

此示例代码实现了以下功能:

  • 初始化Firebase应用并与Firebase Storage进行配置。
  • 创建了一个带有底部导航栏的应用程序,允许用户在列表视图和网格视图之间切换。
  • 使用StorageListViewStorageGridView从Firebase Storage加载图片,并通过AspectRatioStorageImage组件展示。
  • 提供了一个UploadButton按钮,允许用户上传文件到Firebase Storage,并在上传完成后刷新视图。

希望这个完整的示例能够帮助你更好地理解和使用firebase_ui_storage插件。如果你有任何问题或需要进一步的帮助,请随时提问!


更多关于Flutter Firebase UI集成插件firebase_ui_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Firebase UI集成插件firebase_ui_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中集成和使用firebase_ui_storage插件的示例代码。不过需要注意的是,firebase_ui_storage插件实际上并不存在作为一个独立的Firebase UI组件。Firebase UI通常指的是用于身份验证(如Email/Password, Google, Facebook等)的UI库,并不直接包含存储(Storage)功能。不过,我们可以结合firebase_storage插件来实现存储功能,并使用Flutter的UI组件来展示和操作存储内容。

以下是一个使用firebase_storage插件来上传和下载文件的示例代码:

1. 添加依赖

首先,在你的pubspec.yaml文件中添加firebase_corefirebase_storage依赖:

dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^1.13.1  # 确保使用最新版本
  firebase_storage: ^10.2.10  # 确保使用最新版本

2. 配置Firebase

确保你已经在Firebase控制台中创建了项目,并添加了你的Flutter应用。然后,将生成的google-services.json(Android)和GoogleService-Info.plist(iOS)文件放置到相应的项目目录中。

3. 初始化Firebase

在你的应用的主文件中(通常是main.dart),初始化Firebase:

import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_storage/firebase_storage.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

4. 上传和下载文件

接下来,创建一个页面来演示如何上传和下载文件:

import 'package:flutter/material.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'dart:io';
import 'package:path_provider/path_provider.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Firebase Storage Demo',
      home: StorageDemo(),
    );
  }
}

class StorageDemo extends StatefulWidget {
  @override
  _StorageDemoState createState() => _StorageDemoState();
}

class _StorageDemoState extends State<StorageDemo> {
  final FirebaseStorage _storage = FirebaseStorage.instance;
  String? _imageUrl;

  Future<void> _uploadFile() async {
    final Directory tempDir = await getTemporaryDirectory();
    final File tempFile = File('${tempDir.path}/temp_image.jpg');
    // 这里你应该使用实际的文件路径,这里仅作为示例
    // 你可以使用ImagePicker来选择图片,或者使用其他方式获取文件

    // 为了示例,我们假设这里已经有一个文件在tempFile路径下
    // 在实际使用中,你需要替换这部分逻辑

    Reference ref = _storage.ref().child('images/temp_image.jpg');
    await ref.putFile(tempFile);

    // 获取下载URL
    String url = await ref.getDownloadURL();
    setState(() {
      _imageUrl = url;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firebase Storage Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _uploadFile,
              child: Text('Upload File'),
            ),
            SizedBox(height: 20),
            if (_imageUrl != null)
              Image.network(_imageUrl!),
            else
              Text('No image uploaded yet'),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 文件选择:上述代码仅作为演示,没有实际选择文件。在实际应用中,你可以使用image_picker或其他文件选择器插件来选择文件。
  2. 错误处理:为了简洁,上述代码没有包含错误处理逻辑。在生产环境中,你应该添加适当的错误处理来确保应用的健壮性。
  3. 权限:确保你的Firebase项目已正确配置存储规则,以允许你的应用进行读写操作。

通过上述步骤,你可以在Flutter应用中集成Firebase Storage并实现文件上传和下载功能。虽然firebase_ui_storage插件不存在,但你可以结合firebase_storage和Flutter的UI组件来实现类似的功能。

回到顶部