Flutter集成Google Cloud服务插件google_cloud的使用

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

Flutter集成Google Cloud服务插件google_cloud的使用

简介

pub package package publisher

google_cloud 是一个用于在 Google Cloud Platform (GCP) 上正确运行 Dart 代码的工具包。该项目由社区支持,没有官方的支持级别,代码不受任何 SLA 或弃用政策的保护。

功能包括:

未来可能会添加更多功能。

反馈和问题

如果您有任何想法或遇到问题,请在 GitHub 讨论区 开始讨论,或在 GitHub 问题跟踪器 中提交问题。

示例代码

以下是一个使用 google_cloud 插件访问 Google Cloud Firestore 的示例代码。该示例展示了如何创建一个简单的 HTTP 服务器,通过 Firestore 增加一个计数器。

// Copyright (c) 2021, the Dart 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 'dart:convert';
import 'package:google_cloud/google_cloud.dart';
import 'package:googleapis/firestore/v1.dart';
import 'package:googleapis_auth/auth_io.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;

Future<void> main() async {
  final server = await _Server.create();

  try {
    await serveHandler(server.handler);
  } finally {
    server.close();
  }
}

class _Server {
  _Server._({
    required this.projectId,
    required this.client,
    required this.hosted,
  });

  static Future<_Server> create() async {
    String? projectId;
    bool hosted;

    try {
      projectId = await projectIdFromMetadataServer();
      hosted = true;
    } on BadConfigurationException {
      projectId = projectIdFromEnvironment();
      hosted = false;
    }

    if (projectId == null) {
      throw BadConfigurationException(
        '''
Could not contact GCP metadata server or find the project-id in one of these
environment variables:
  ${gcpProjectIdEnvironmentVariables.join('\n  ')}''',
      );
    }

    print('Current GCP project id: $projectId');

    final authClient = await clientViaApplicationDefaultCredentials(
      scopes: [FirestoreApi.datastoreScope],
    );

    return _Server._(projectId: projectId, client: authClient, hosted: hosted);
  }

  final String projectId;
  final AutoRefreshingAuthClient client;
  final bool hosted;

  late final FirestoreApi api = FirestoreApi(client);
  late final handler =
      createLoggingMiddleware(projectId: hosted ? projectId : null)
          .addMiddleware(_onlyGetRootMiddleware)
          .addHandler(_incrementHandler);

  Future<Response> _incrementHandler(Request request) async {
    final result = await api.projects.databases.documents.commit(
      _incrementRequest(projectId),
      'projects/$projectId/databases/(default)',
    );

    return Response.ok(
      JsonUtf8Encoder(' ').convert(result),
      headers: {'content-type': 'application/json'},
    );
  }

  void close() {
    client.close();
  }
}

/// 对于 `GET` 请求对象到 [handler],否则返回 404。
Handler _onlyGetRootMiddleware(Handler handler) => (Request request) async {
      if (request.method == 'GET' && request.url.pathSegments.isEmpty) {
        return await handler(request);
      }

      throw BadRequestException(404, 'Not found');
    };

CommitRequest _incrementRequest(String projectId) => CommitRequest(
      writes: [
        Write(
          transform: DocumentTransform(
            document:
                'projects/$projectId/databases/(default)/documents/settings/count',
            fieldTransforms: [
              FieldTransform(
                fieldPath: 'count',
                increment: Value(integerValue: '1'),
              ),
            ],
          ),
        ),
      ],
    );

Future<void> serveHandler(Handler handler) async {
  final server = await shelf_io.serve(handler, InternetAddress.anyIPv4, 8080);
  print('Serving at http://${server.address.host}:${server.port}');
}

说明

  1. 项目 ID 获取_Server 类中的 create 方法尝试从 GCP 元数据服务器获取项目 ID,如果失败则从环境变量中获取。
  2. 身份验证:使用 clientViaApplicationDefaultCredentials 获取自动刷新的身份验证客户端。
  3. HTTP 服务器:使用 shelfshelf_io 创建一个简单的 HTTP 服务器,处理 GET 请求并增加 Firestore 中的计数器。
  4. 日志记录:使用 createLoggingMiddleware 添加结构化日志记录。

运行示例

  1. 确保你已经安装了 Dart 和 Flutter。

  2. 配置 GCP 项目并启用 Firestore API。

  3. 设置环境变量 GOOGLE_APPLICATION_CREDENTIALS 指向你的服务账户密钥文件。

  4. 运行示例代码:

    dart run
    
  5. 访问 http://localhost:8080 查看结果。

希望这个示例能帮助你更好地理解和使用 google_cloud 插件。如果有任何问题或建议,请随时提出。


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

1 回复

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


在Flutter中集成Google Cloud服务通常涉及使用Firebase或其他Google Cloud提供的API服务。google_cloud 这个包在Flutter的pub.dev上并不是一个官方的或者广泛认可的包名,可能是指广义上的与Google Cloud服务交互的插件集合。由于Google Cloud服务众多,这里我们以Firebase Authentication作为示例,展示如何在Flutter应用中集成并使用它。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  firebase_auth: ^3.3.5  # 请检查pub.dev获取最新版本

然后运行flutter pub get来安装依赖。

步骤 2: 配置Firebase项目

  1. 前往Firebase控制台,创建一个新的Firebase项目或者选择已有的项目。
  2. 在Firebase控制台中,为你的应用添加Flutter平台支持,按照指示下载google-services.json文件。
  3. google-services.json文件放置在android/app/目录下。
  4. 对于iOS,你需要在Xcode中配置Firebase SDK。按照Firebase控制台的指示,下载并配置GoogleService-Info.plist文件。

步骤 3: 初始化Firebase Auth

在你的Flutter应用中,初始化Firebase Auth服务:

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Firebase Auth Example'),
        ),
        body: FirebaseAuthExample(),
      ),
    );
  }
}

步骤 4: 实现登录功能

下面是一个简单的例子,展示如何使用Email和密码进行用户认证:

class FirebaseAuthExample extends StatefulWidget {
  @override
  _FirebaseAuthExampleState createState() => _FirebaseAuthExampleState();
}

class _FirebaseAuthExampleState extends State<FirebaseAuthExample> {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  String _email = '';
  String _password = '';
  String _userStatus = '';

  Future<void> _signIn() async {
    try {
      UserCredential result = await _auth.signInWithEmailAndPassword(
        email: _email,
        password: _password,
      );
      User? user = result.user;
      if (user != null) {
        setState(() {
          _userStatus = 'Signed in as ${user.email}';
        });
      }
    } catch (e) {
      setState(() {
        _userStatus = 'Failed to sign in: ${e.message}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          TextField(
            keyboardType: TextInputType.emailAddress,
            decoration: InputDecoration(labelText: 'Email'),
            onChanged: (value) {
              setState(() {
                _email = value;
              });
            },
          ),
          SizedBox(height: 16),
          TextField(
            obscureText: true,
            decoration: InputDecoration(labelText: 'Password'),
            onChanged: (value) {
              setState(() {
                _password = value;
              });
            },
          ),
          SizedBox(height: 16),
          ElevatedButton(
            onPressed: _signIn,
            child: Text('Sign In'),
          ),
          SizedBox(height: 16),
          Text(
            _userStatus,
            style: TextStyle(fontSize: 18),
          ),
        ],
      ),
    );
  }
}

结论

上述代码展示了如何在Flutter应用中集成并使用Firebase Authentication服务。虽然google_cloud这个术语可能涵盖了更广泛的Google Cloud服务,但具体到Flutter开发,使用Firebase是最常见和直接的方式之一。对于其他Google Cloud服务,如Cloud Functions、Cloud Storage等,Flutter社区也提供了相应的插件,你可以按照类似的方式集成和使用它们。

请确保你遵循Google Cloud和Firebase的最新文档,因为API和服务可能会随时间更新。

回到顶部