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

[Bug] [Dúvida] `No TaskInherited found in context`

Estou com o mesmo problema da dúvida aberta no dia 15 de Dezembro do ano passado e que, por algum motivo não tem resposta adequada de ninguém do time da Alura.

Quando clico o botão de adicionar aparece o mesmo problema: ======== Exception caught by gesture =============================================================== The following assertion was thrown while handling a gesture: No TaskInherited found in context 'package:primeiro_projeto/data/task_inherited.dart': Failed assertion: line 25 pos 12: 'result != null'

Sim, é um problema de contexto. Q & A:

  • Não não há problemas de configuração
  • Sim, as rotas estão configuradas corretamente

Esse é o repositório do github do projeto: https://github.com/analubarreto/primeiro_projeto_flutter

Essa é o main.dart (sem os imports):

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        useMaterial3: true,
        primarySwatch: Colors.deepPurple,
      ),
      home: TaskInherited(
        child: const InitialScreen(),
      ),
      initialRoute: '/',
      routes: {
        '/form': (newContext) => FormScreen(context)
      }
    );
  }
}

e acredito não ser necessário mais nada já que ao chamar Navigator.of(context).pushNamed('/form'); dentro do botão ele chama o widget que está no setado no routes.

2 respostas

Olá, Ana! Tudo bem?

Entendo que você está enfrentando o mesmo problema que foi relatado anteriormente e ainda não encontrou uma resposta adequada. Vou tentar te ajudar da melhor forma possível!

Pelo que pude analisar, o erro "No TaskInherited found in context" ocorre quando não é possível encontrar um widget do tipo TaskInherited no contexto em que está sendo utilizado. Isso pode acontecer quando você tenta acessar algum valor ou função específica desse widget, mas ele não está presente na árvore de widgets.

No seu código, você está envolvendo o widget InitialScreen com o TaskInherited no home da sua aplicação. Porém, ao chamar Navigator.of(context).pushNamed('/form') dentro do botão, você está criando um novo contexto para o FormScreen, e esse novo contexto não possui o TaskInherited na sua árvore de widgets.

Uma possível solução seria passar o TaskInherited para o contexto do FormScreen. Você pode fazer isso utilizando o Builder widget dentro das rotas, da seguinte forma:

routes: {
  '/form': (newContext) => Builder(
    builder: (context) => FormScreen(context),
  ),
}

Dessa forma, o Builder irá criar um novo contexto para o FormScreen, mas mantendo o TaskInherited na árvore de widgets desse novo contexto.

Espero que essa sugestão te ajude a resolver o problema! Se ainda tiver alguma dúvida, é só perguntar. Estou aqui para ajudar!

Espero ter ajudado e bons estudos!

solução!

Consegui resolver, mas não acho que é a melhor solução para esse problema já que em uma aplicação maior não funcionaria bem de forma nenhuma, se houver qualquer sugestão de como melhorar isso, agradeceria... De qualquer forma, a solução que encontrei foi envolver o MaterialApp com o TaskInherited.

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return TaskInherited(
      child: MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        useMaterial3: true,
        primarySwatch: Colors.deepPurple,
      ),
      initialRoute: '/',
      routes: {
        '/': (context) => const InitialScreen(),
        '/form': (context) => const FormScreen(),
      }
    )
    );
  }
}

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