(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 的弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章