Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

flutter

bloc

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)

like image 904
midi Avatar asked Jan 10 '21 19:01

midi


People also ask

Is the method'ancestorstateoftype'defined for class'buildcontext'in flutter?

Flutter master branch issue - The method 'ancestorStateOfType' isn't defined for the class 'BuildContext'. · Issue #140 · fluttercommunity/flutter_google_places · GitHub

What causes this error inheritfromwidgetofexacttype?

This error is caused by inheritFromWidgetOfExactType method. This method is deprecated . Use dependOnInheritedWidgetOfExactType instead.

What is buildcontext in statelesswidget?

A handle to the location of a widget in the widget tree. This class presents a set of methods that can be used from StatelessWidget.build methods and from methods on State objects. BuildContext objects are passed to WidgetBuilder functions (such as StatelessWidget.build ), and are available from the State.context member.

When should I use dependoninheritedwidgetofexacttype?

In general, dependOnInheritedWidgetOfExactType is more appropriate for such cases. This method is useful for changing the state of an ancestor widget in a one-off manner, for example, to cause an ancestor scrolling list to scroll this build context's widget into view, or to move the focus in response to user interaction.


Video Answer


3 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

like image 187
Людмила Avatar answered Oct 17 '22 15:10

Людмила


You are using an old version of flutter_bloc, first you should upgrade it.

But, in fact the real problem is that context.ancestorInheritedElementForWidgetOfExactType(type) is deprecated in favor of context.getElementForInheritedWidgetOfExactType<T>() but still available in the stable channel, but in master is already removed.

Then it is necessary to update your code because Bloc has suffered breaking changes.

UPDATE: The mentioned change is already in the stable channel.

like image 3
Frank Moreno Avatar answered Oct 17 '22 15:10

Frank Moreno


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

like image 3
gbibhav Avatar answered Oct 17 '22 14:10

gbibhav