1
resposta

Meu KakoBot não printa conforme mostrado em aula.

kako_bot.dart

import 'dart:io';
import 'questions/time_questions.dart';
import 'questions/timing/waintg_time.dart';

void main() async {
  String kakoBot = 'KakoBOT:\n';
  var a = true;
  String usuario = '';

  var mystream = BotClock().KakoBotStream(1, 10);
  var subcriber = mystream.listen(
    (event) {
      print(
          '                          KAKO BOT está ativo por $event segundos');
    },
    onDone: () {
      print('Kako Bot finanlizou seu trabalho');
      a = false;
    },
  );

  print('-- Iniciando o KakoBOT, aguarde..--');
  await BotClock().clock(3);
  print('KakoBOT:\n Oi :) \n Como posso ajudar?');
  do {
    usuario = stdin.readLineSync().toString();
    print('-- Processando pergunta, aguarde..--');
    await BotClock().clock(1);
    if (usuario.contains('xau') ||
        usuario.contains('Xau') ||
        usuario.contains('Adeus') ||
        usuario.contains('adeus')) {
      a = false;
      print(kakoBot + ' Até a proxima!!');
    } else if (TimeQuestions(usuario).isThisTime()) {
      // verificar antes, assim não fazemos toda a função sem precisar.
      TimeQuestions(usuario).timeQuestion();
      await BotClock().clock(1);
    } else {
      await BotClock().clock(2);
      print(kakoBot +
          ' Não fui treinado para responder a essa pergunta \n Desculpe :( ');
      print(kakoBot + ' Você pode fazer outra pergunta ou dizer Adeus');
    }
  } while (a);

  print('--Encerrando KakoBOT--');
}

wainth_time.dart

class BotClock {
  Future clock(int seconds) {
    return Future.delayed(Duration(seconds: seconds));
  }

  Stream KakoBotStream(int interval, [int? maxCount]) async* {
    int i = 1;
    while (i != maxCount) {
      Future.delayed(Duration(seconds: interval));
      yield i++;
    }

    print('A Stream acabou');
  }
}

Print do resultado da execução Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Essa é o arquivo streams.dart

import 'dart:async';

void main() async {
  Stream myStream(int interval, [int? maxCount]) async* {
    int i = 1;
    while (i != maxCount) {
      print('Contando: $i');
      Future.delayed(Duration(seconds: interval));
      yield i++;
    }

    print('A Stream acabou');
  }

  var kakoStream = myStream(1).asBroadcastStream();
  StreamSubscription myStreamSubcription = myStream(1).listen((event) {
    if (event.isEven) {
      print('Esse número é Even!');
    }
  }, onError: (e) {
    print('Error: $e');
  }, onDone: () {
    print('Deu certo');
  });
  kakoStream.map((event) => 'Subscriber 2 watching: $event').listen(print);

  await Future.delayed(Duration(seconds: 3));
  myStreamSubcription.pause();
  print('Stream Pausada');

  await Future.delayed(Duration(seconds: 3));
  myStreamSubcription.resume();
  print('Stream retomada');

  await Future.delayed(Duration(seconds: 3));
  myStreamSubcription.cancel();
  print('Stream cancelada');

  print('A main acabou');
}

Alguém pode me ajudar a entender o motivo de não printar igual nas aulas na sessão Stream. Grato.

1 resposta

Olá, Vinícius!

Parece que o problema está na função KakoBotStream que você criou na classe BotClock. Você está usando o Future.delayed para adicionar um delay antes de cada yield, mas você não está esperando o Future.delayed terminar antes de continuar para o próximo loop.

A função Future.delayed retorna um Future que completa após um delay. No entanto, se você não usar a palavra-chave await, o Dart não vai esperar o Future completar e vai continuar para a próxima linha de código.

Então, no seu código, o loop está rodando muito rápido, porque ele não está realmente esperando o delay. Isso pode ser o motivo pelo qual você não está vendo os prints que esperava.

Aqui está como você pode corrigir isso:

class BotClock {
  Future clock(int seconds) {
    return Future.delayed(Duration(seconds: seconds));
  }

  Stream KakoBotStream(int interval, [int? maxCount]) async* {
    int i = 1;
    while (i != maxCount) {
      await Future.delayed(Duration(seconds: interval));
      yield i++;
    }

    print('A Stream acabou');
  }
}

Neste código corrigido, eu adicionei a palavra-chave await antes do Future.delayed. Isso faz com que o Dart espere o Future.delayed completar antes de continuar para a próxima linha de código, o que deve fazer com que o seu código funcione como esperado.

Espero ter ajudado e bons estudos!