(YoutubeAPI,Flutter) 我没有看到选择 youtube chanel 的弹出窗口

Posted

技术标签:

【中文标题】(YoutubeAPI,Flutter) 我没有看到选择 youtube chanel 的弹出窗口【英文标题】:(YoutubeAPI,Flutter) I don't see a popup to select a youtube chanel 【发布时间】:2021-09-16 01:43:15 【问题描述】:

在用户使用谷歌方法登录我的应用后,我尝试获取用户播放列表。

当我尝试从 https://developers.google.com/youtube/v3/docs/playlists/list?apix=true 获取我的 youtube 播放列表并将其作为请求时:

GET https://youtube.googleapis.com/youtube/v3/playlists?part=snippet&maxResults=25&mine=trueHTTP/1.1

授权:承载 [YOUR_ACCESS_TOKEN] 接受:application/json

我看到弹出窗口选择我的众多频道之一,一切都很棒。我有响应类型 200 和完整数据

但是.......

当我从颤振应用程序执行相同的请求时,我没有看到弹出窗口,并且我有DetailedApiRequestError(状态:404,消息:未找到频道。)

谁能帮忙?

代码如下:

import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart'
    as auth;
import 'package:google_sign_in/google_sign_in.dart';
import 'package:googleapis/people/v1.dart';
import "package:googleapis/youtube/v3.dart";
import 'dart:async';
import 'package:flutter/material.dart';

void main() 
  runApp(
    MaterialApp(
      title: 'Google Sign In',
      home: SignInDemo(),
    ),
  );


class SignInDemo extends StatefulWidget 
  @override
  State createState() => SignInDemoState();


class SignInDemoState extends State<SignInDemo> 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
        appBar: AppBar(
          title: const Text('Google Sign In'),
        ),
        body: ConstrainedBox(
          constraints: const BoxConstraints.expand(),
          child: _buildBody(),
        ));
  

  Widget _buildBody() 
    return ElevatedButton(
      child: const Text('SIGN IN'),
      onPressed: _handleSignIn,
    );
  

  Future<void> _handleSignIn() async 
    final _googleSignIn = new GoogleSignIn(
      scopes: [
        PeopleServiceApi.contactsReadonlyScope,
        YouTubeApi.youtubepartnerScope,
        YouTubeApi.youtubeForceSslScope,
        YouTubeApi.youtubeScope,
        YouTubeApi.youtubeReadonlyScope,
        YouTubeApi.youtubeChannelMembershipsCreatorScope,
        YouTubeApi.youtubeScope,
        YouTubeApi.youtubepartnerChannelAuditScope,
      ],
    );
    await _googleSignIn.signOut();
    await _googleSignIn.signIn();

    final httpClient = await _googleSignIn.authenticatedClient();
    final YouTubeApi youtubeApi = YouTubeApi((httpClient)!);

    final response = await youtubeApi.playlists.list(
      ["snippet"],
      mine: true,
      maxResults: 25,
    );
    print(response.items!.length);
  


当我在https://developers.google.com/youtube/v3/docs/playlists/list?apix=true 上使用 ApiExplorer 时,我会看到带有我的频道列表的弹出窗口,在选择其中一个之后,我会得到一个有效的 oauth 令牌。当我使用这一行“最终 httpClient = await _googleSignIn.authenticatedClient();”时几乎所有 youtube 范围内我也得到了 oauth 令牌,但是当我把它放在我的 YoutubeApi 请求中时,我得到了

"error": 
        "code": 404,
        "message": "Channel not found.",
        "errors": [
            
                "message": "Channel not found.",
                "domain": "youtube.playlist",
                "reason": "channelNotFound",
                "location": "channelId",
                "locationType": "parameter"
            
        ]
     

我看到了第一个弹出窗口。我可以选择我的 gmail 帐户。但是当我尝试从 youtube 加载一些私人数据时,我应该会看到第二个弹出窗口来选择 youtube 频道,因为我有多个频道分配给我的 google 帐户,但是第二个弹出窗口没有打开,我有错误 404 channel not found 这非常奇怪,因为当我使用与 youtube api 非常相似的 https://developers.google.com/people 时,一切都运行良好

【问题讨论】:

在 Flutter 中尝试从 Google API 获取数据时涉及更多内容。值得庆幸的是,Flutter 官方文档有一篇关于这个特殊案例的精彩文章:YouTube API - Flutter 【参考方案1】:

这里的问题似乎是您没有完全遵循此实现的文档。

问题出在这些行上:

final httpClient = await _googleSignIn.authenticatedClient();
final YouTubeApi youtubeApi = YouTubeApi((httpClient)!);

那么recommended implementation 显示的是什么:

var httpClient = (await _googleSignIn.authenticatedClient())!;

这基本上创建了一个后缀! 运算符,它确保了转换,所以如果await _googleSignIn.authenticatedClient() 的结果为空,情况会怎样,因为用户在第一次运行时没有经过身份验证,它会转换它的类型到httpClient

但在您的实现中,您已将 httpClient 声明为:

final httpClient = await _googleSignIn.authenticatedClient();

因此,当代码第一次运行时,它会返回失败状态/null,因为用户没有登录,所以你的YouTubeApi不会收到用户成功登录的更新,因此您将无法访问其令牌。

所以改变这个小细节对你来说应该足够了:)

【讨论】:

Nope 还是什么都没有,加上你的更改后的一个大红色错误:dart Warning: Operand of null-aware operation '!' has type 'AuthClient' which excludes null. - 'AuthClient' is from 'package:googleapis_auth/src/auth_client.dart' ('../../../flutter/.pub-cache/hosted/pub.dartlang.org/googleapis_auth-1.1.0/lib/src/auth_client.dart'). final YouTubeApi youtubeApi = YouTubeApi((httpClient)!);

以上是关于(YoutubeAPI,Flutter) 我没有看到选择 youtube chanel 的弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

为了看Flutter到底有没有人用我竟然

使用 YoutubeAPI 播放 youtube 视频直到特定时间并暂停

如何在没有主机的情况下启动我的 Flutter 应用程序?

Youtube API - 没有频道名称

Flutter 中的自动填充文本字段

flutter json数据解析