Error: The method 'ancestorStateOfType' isn't defined for the class 'BuildContext'

Viewed 20455

When using the class Bloc provider as follows, I get the error:

'The method 'ancestorInheritedElementForWidgetOfExactType' isn't defined for the type 'BuildContext'.'

So I replaced this line context.ancestorInheritedElementForWidgetOfExactType(type)?.widget;

with this line context.getElementForInheritedWidgetOfExactType<_BlocProviderInherited<T>>().widget;

but then I get the following Error:

Error output from Xcode build:
↳
** BUILD FAILED **

Xcode's output:
↳
../../../development/flutter/.pub-cache/hosted/pub.dartlang.org/dynamic_theme-1.0.1/lib/dynamic_theme.dart:25:20: Error: The method 'ancestorStateOfType' isn't defined for the class 'BuildContext'.
 - 'BuildContext' is from 'package:flutter/src/widgets/framework.dart' ('../../../development/flutter/packages/flutter/lib/src/widgets/framework.dart').
Try correcting the name to the name of an existing method, or defining a method named 'ancestorStateOfType'.
    return context.ancestorStateOfType(const TypeMatcher<DynamicThemeState>());
                   ^^^^^^^^^^^^^^^^^^^

Command PhaseScriptExecution failed with a nonzero exit code
note: Using new build system
note: Building targets in parallel
note: Planning build
note: Constructing build description

Could not build the precompiled application for the device.

Error launching application on iPhone 

This is the Bloc Provider i am using:

class BlocProvider<T extends BlocBase> extends StatefulWidget {
   BlocProvider({
   Key key,
   @required this.child,
   @required this.bloc,}) : super(key: key);
   final Widget child;
   final T bloc;
   @override
   _BlocProviderState<T> createState() => _BlocProviderState<T>();

   static T of<T extends BlocBase>(BuildContext context) {
   final type = _typeOf<_BlocProviderInherited<T>>();
   _BlocProviderInherited<T> provider =
   context.ancestorInheritedElementForWidgetOfExactType(type)?.widget;
   return provider?.bloc;
  }
}

I am on the Master channel, Flutter (Channel master, 1.26.0-2.0.pre.275)

7 Answers

after upgrade dev channel was almost the same issue

.pub-cache/hosted/pub.dartlang.org/dynamic_theme-1.0.1/lib/dynamic_theme.dart:25:20: Error: The method 'ancestorStateOfType' isn't defined for the class 'BuildContext'.
'BuildContext' is from 'package:flutter/src/widgets/framework.dart' ('/home/liudmila/snap/flutter/common/flutter/packages/flutter/lib/src/widgets/framework.dart').
Try correcting the name to the name of an existing method, or defining a method named 'ancestorStateOfType'.

with block 4.0.0

just change this in file .pub-cache/../dynamic_theme.dart:25:20

context.ancestorStateOfType()

on that

context.findAncestorStateOfType<DynamicThemeState>();

thats temp solution, but app is work

try changing the packages version in pubspec.yaml it worked for me i changed provider version to 5.0.0 , then it started working

This error is caused when the package gets outdated. So upgrading the package is one solution to it. But sometimes, even upgrading the package does not work because maybe the creator of the package has not upgraded it or has abandoned it. In that case switch to other package.

In this particular case upgrading flutter_bloc might work.

Another similar problem i faced with GradientAppBar. It gives same error as above. The solution is to use AppBar beacuse AppBar now supports gradient inside it.

AppBar(
      flexibleSpace: Container(
      decoration: BoxDecoration(
        gradient: LinearGradient(
        begin: Alignment.topCenter,
        end: Alignment.bottomCenter,
        colors: [
          Colors.amber[700],
          Colors.grey[800],
        ]
      )
    )
  ),

I am posting about gradient app bar here because I came in this post to find the solution about GradientAppBar but couldn't find.

change it from

context.findAncestorStateOfType<DynamicThemeState>();

to

context.findAncestorStateOfType<*Your_Library*>();

this will work

context.findAncestorStateOfType<your_library_name>()

In my case this error occurs in animated_circular_chart so, I've added this line to my animated_circular_chart.dart

Just change it to this it works.

context.findAncestorStateOfType<DynamicThemeState>();

it is just code update in new flutter version, older one is depreciated

Related