Вызов потока googleapis_auth из компонента AngularDart

Я пытаюсь запустить поток OAuth, используя пакет googleapis_auth из компонента AngularDart (MaterialButtonComponent).

Примеры из googleapis_examples (здесь ) покажите, как это сделать с необработанным ButtonElement, чтобы всплывающее окно не блокировалось браузером. Однако, когда я следую тому же шаблону, используя стиль AngularDart, используя синтаксис (trigger)="method()" или (click)="method()", мое всплывающее окно блокируется.

Текущий код:

диск_компонент.html:

<material-button icon (trigger)="save()"
             class="icon-button">
<material-icon icon="archive"></material-icon>

drive_component.dart

import 'package:angular/angular.dart';
import 'package:angular_components/angular_components.dart';
import 'package:blue_rose_character_creator/src/character/character.dart';
import 'package:googleapis_auth/auth_browser.dart';
import 'package:googleapis/drive/v3.dart';

final identifier = new ClientId(
    "<my-client>.apps.googleusercontent.com",
    null);
const scopes = const [DriveApi.DriveScope];

@Component(
  selector: 'drive',
  templateUrl: 'drive_component.html',
  styleUrls: const ['drive_component.css'],
  directives: const [CORE_DIRECTIVES, materialDirectives],
  providers: const [materialProviders],
)
class DriveComponent {
  @Input() Character character;

  void save() {
    createImplicitBrowserFlow(identifier, scopes)
        .then((BrowserOAuth2Flow flow) {
      // Try getting credentials without user consent.
      // This will succeed if the user already gave consent for this application.
      return flow.clientViaUserConsent(immediate: true).catchError((_) {

        //I've removed the loginButton from the flow, since AngularDart
        //doesn't pass this around.
        //loginButton.text = 'Authorize';
        //return loginButton.onClick.first.then((_) {
        return flow.clientViaUserConsent(immediate: false);
      }, test: (error) => error is UserConsentException);
    });
  }

Каким будет правильный стиль AngularDart, чтобы разблокировать всплывающее окно? Есть ли один?


person emerssso    schedule 24.03.2018    source источник
comment
Вы пробовали (click)="method()"? Я знаю, что это может вызвать другие проблемы, но было бы интересно, если бы это что-то сделало.   -  person Günter Zöchbauer    schedule 24.03.2018
comment
Тот же эффект, к сожалению. Я обновлю вопрос. Хотя идея хорошая, спасибо!   -  person emerssso    schedule 24.03.2018
comment
Работает ли это с обычным <button (click)="method()">log in</button>?   -  person Günter Zöchbauer    schedule 24.03.2018
comment
Нет, по-прежнему блокирует всплывающее окно.   -  person emerssso    schedule 24.03.2018
comment
Какой код вы на самом деле вызываете (click)="..." или (trigger)="..."?   -  person Günter Zöchbauer    schedule 24.03.2018
comment
Метод сохранения в dart_component.dart.   -  person emerssso    schedule 24.03.2018
comment
Я действительно не понимаю, чего вы пытаетесь достичь, но я думаю, проблема в том, что код, открывающий всплывающее окно, должен вызываться напрямую из обработчика кликов, а не из какого-то асинхронного кода или подобного.   -  person Günter Zöchbauer    schedule 24.03.2018


Ответы (1)


Я думаю, проблема в том, что у вас есть асинхронная операция между вызовом save и вызовом clientViaUserConsent.

Я бы попробовал вызвать createImplicitBrowserFlow при загрузке компонента и не включать сохранение, пока у вас не будет сохранен объект flow.

Есть смысл?

person Kevin Moore    schedule 28.03.2018
comment
Спасибо, это задело! Было бы нормально, если бы я отредактировал ответ, чтобы показать, что я изменил, чтобы он работал, чтобы сэкономить время для следующего человека? - person emerssso; 28.03.2018
comment
Я так думаю... просто добавьте его в новый раздел внизу... или что-то в этом роде. :-) - person Kevin Moore; 28.03.2018