Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Error: The argument type 'Object?' can't be assigned to the parameter type 'BuildContext'

Galeres, to fazendo o exercício do curso de flutter e resolvi deixar a navegação por rota nomeada. Aprendi que tinha que usar o onGenerateRoute para conseguir passar o context para o form que cria a task porém quando incluo o 'settings.arguments' no return ele acusa essa msg: The argument type 'Object?' can't be assigned to the parameter type 'BuildContext'.

  return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      initialRoute: "/Tarefas",
      onGenerateRoute: (RouteSettings settings) {
        if(settings.name == '/Tarefas'){
        return MaterialPageRoute (builder: (context) => TaskInherited(child: const InitialScreen()));}
        else if(settings.name == '/addTask'){
        return MaterialPageRoute (builder: (context) => FormScreen(taskContext: settings.arguments));}
        return null;
      },
    );

alguém sabe do que se trata?

Aqui está o projeto no github https://github.com/Thithi-Heinrich/first_exercise_Alura O problema ocorre logo na main.

3 respostas

Olá Thiago, tudo bem?

Parabéns por fazer a atividade explorando novos caminhos! Você teve o pensamento correto! O erro só é que settings.arguments retorna um tipo Object?. O que você pode fazer é um casting antes de passar o argumento.

      onGenerateRoute: (RouteSettings settings) {
        if(settings.name == '/Tarefas'){
        return MaterialPageRoute (builder: (context) => TaskInherited(child: const InitialScreen()));}
        else if(settings.name == '/addTask'){
          final args = settings.arguments as BuildContext;
        return MaterialPageRoute (builder: (context) => FormScreen(taskContext: args));}
        return null;
      },

Você até poderia trocar o nome args por taskContext.

Espero ter ajudado!

solução!

Matheus, muito obrigado pela resposta. Super me ajudou a entender a situação. Olhe só a forma que resolvi:

initialRoute: "/Tarefas",
      onGenerateRoute: (RouteSettings settings) {
        if(settings.name == '/Tarefas'){
        return MaterialPageRoute (builder: (context) => TaskInherited(child: const InitialScreen()));}
        else if(settings.name == '/addTask'){
        return MaterialPageRoute (builder: (context) => FormScreen(taskContext: settings.arguments as BuildContext));}
        return null;

No fim das contas eu só acrescentei o as BuildContext junto do arguments sem criar um novo objeto para isso e deu certo. Existe alguma ressalva para essa minha solução?

Fala Thiago!

A sua solução inclusive ficou mais otimizada que a minha. Você fez o casting dentro da chamada da tela. Ótima solução!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software