The instance member 'widget' can't be accessed in an initializer - flutter

In my project, I pass data from one widget to another using this code:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
TranslatorSignUpStep2(transModel: this._translatorModel),
),
);
Then I retrive it in the other widget by the code below:
class TranslatorSignUpStep2 extends StatefulWidget {
final TranslatorModel transModel;
TranslatorSignUpStep2({this.transModel});
#override
_TranslatorSignUpStep2State createState() => _TranslatorSignUpStep2State();
}
The problem is, in the TranslatorSignUpStep2 class I want to assign the passed-in transModel to another variable so I write this code
class _TranslatorSignUpStep2State extends State<TranslatorSignUpStep2> {
TranslatorModel _translatorModel = widget.transModel;
}
But it seems like the widget can't be used outside the build method so I get error saying
The instance member 'widget' can't be accessed in an initializer.. Anyone know how to get over this ?

you can access widget in initState function like this.
class _TranslatorSignUpStep2State extends State<TranslatorSignUpStep2> {
TranslatorModel _translatorModel ;
#override
void initState() {
_translatorModel = widget.transModel;
}
}

Just add the keyword late while initializing:
class TranslatorSignUpStep2 extends StatefulWidget {
final TranslatorModel transModel;
TranslatorSignUpStep2({this.transModel});
#override
_TranslatorSignUpStep2State createState() => _TranslatorSignUpStep2State();
}
class _TranslatorSignUpStep2State extends State<TranslatorSignUpStep2> {
late TranslatorModel _translatorModel = widget.transModel;
}

try this code :
TranslatorSignUpStep2 :
class TranslatorSignUpStep2 extends StatefulWidget {
final TranslatorModel transModel;
TranslatorSignUpStep2({this.transModel});
#override
_TranslatorSignUpStep2State createState() => _TranslatorSignUpStep2State(this.transModel);
}
TranslatorSignUpStep2 class :
class _TranslatorSignUpStep2State extends State<TranslatorSignUpStep2> {
_TranslatorSignUpStep2State(TranslatorModel _tempModel ){
this._translatorModel =_tempModel;
};
TranslatorModel _translatorModel ;
}

Add static keyword when innitializing

class OrderDetails extends StatefulWidget {
int selectedDays;
OrderDetails({
this.range,)};
#override
_OrderDetailsState createState() => _OrderDetailsState();
}
class _OrderDetailsState extends State<OrderDetails> {
String getRange;
#override
void initState() {
super.initState();
getRange = widget.range;
}

Related

How to override State class so I could access StatefulWidget instance?

So I have 2 classes:
class A extends StatefulWidget {
A({Key? key}) : super(key: key);
#override
State<A> createState() => _AState();
}
class _AState extends State<A> {
#override
Widget build(BuildContext context) {
return Container();
}
void func(){}
}
And I want to override the _AState classes func() method. So I do this like this:
class B extends A{
final item = 10;
#override
State<A> createState() => _BState();
}
class _BState extends _AState{
#override
void func() {
widget.item //can't do this
}
}
I have no problem overriding the func() method, but now I also need to access my new variable item, that is declared in B class. And I know I can't do that because instance widget is provided by State<A> class.
So my question is: How to access the variable item from B class in _BState?
Cast the widget to B object
class _BState extends _AState{
#override
void func() {
// (widget as B).item
}
}

The instance 'widget' can't be accessed in an initializer

I'm having trouble accessing the variable user on _MenuScreenState:
class MenuScreen extends StatefulWidget {
final User user;
MenuScreen(this.user);
#override
_MenuScreenState createState() => _MenuScreenState();
}
class _MenuScreenState extends State<MenuScreen> {
final User userInMenu = widget.user;
}
The problem displayed is "The instance member 'widget' can't be accessed in an initializer.
Try replacing the reference to the instance member with a different expression".
You have to do it inside initState like the following:
class MenuScreen extends StatefulWidget {
final User user;
MenuScreen(this.user);
#override
_MenuScreenState createState() => _MenuScreenState();
}
class _MenuScreenState extends State<MenuScreen> {
User userInMenu = widget.user;
#override
void initState() {
super.initState();
userInMenu = widget.user;
}

The instance member 'currentComponentConfiguration' can't be accessed in an initializer

I have a simple code snippet:
class CreateNewViewPage extends StatefulWidget {
final ComponentConfiguration currentComponentConfiguration = ComponentConfiguration(1, 1);
final Components components = Components(currentComponentConfiguration);
#override
State<StatefulWidget> createState() => _CreateNewViewPage();
}
Unfortunately, when I want to send currentComponentConfiguration to the Components class construct, I get the following information: The instance member 'currentComponentConfiguration' can't be accessed in an initializer.
How can I fix this problem?
You can't use a non-static variable for initialzing another non-static variable. Either make currentComponentConfiguration a static member or do components object creation in State class (_CreateNewViewPageState).
Using Static
class CreateNewViewPage extends StatefulWidget {
static final ComponentConfiguration currentComponentConfiguration = ComponentConfiguration(1, 1);
final Components components = Components(currentComponentConfiguration);
#override
_CreateNewViewPageState createState() => _CreateNewViewPageState();
}
Using State class
class CreateNewViewPage extends StatefulWidget {
final ComponentConfiguration currentComponentConfiguration = ComponentConfiguration(1, 1);
#override
_CreateNewViewPageState createState() => _CreateNewViewPageState();
}
class _CreateNewViewPageState extends State<CreateNewViewPage> {
Components components;
#override
void initState() {
super.initState();
components = Components(widget.currentComponentConfiguration);
}
#override
Widget build(BuildContext context) {
return Text('Hello, World!', style: Theme.of(context).textTheme.headline4);
}
}

getter causes maximum call stack size exceeded flutter

I have the following widget:
class VennDiagramWidget extends StatefulWidget {
VennDiagramWidget(selectedGeneLists);
List<GenesListObjIndexed> get selectedGeneLists => this.selectedGeneLists;
#override
_VennState createState() => _VennState();
}
class _VennState extends State<VennDiagramWidget> {
List<GenesListObjIndexed> _selectedGeneLists;
#override
initState() {
_selectedGeneLists = widget.selectedGeneLists;
}
This widget is intialized by another widget in this way:
.
.
.
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => VennDiagramWidget(selectedGeneLists)));
I get and error of Maximum call stack size exceeded on this line:
_selectedGeneLists = widget.selectedGeneLists; inside initState.
To my knowledge, this code is supposed to construct the class VennDiagramWidget with the selectedGeneLists I have specified on the second snippet, and when I am calling the getter of this class, I should get the exact same variable.
What am I doing wrong?
the problem is, when you're calling the getter selectedGeneLists it's calling itself again
// calling itself ⬇
get selectedGeneLists => this.selectedGeneLists;
you need to declare selectedGeneLists variable in the widget class
this should work
class VennDiagramWidget extends StatefulWidget {
final selectedGeneLists;
VennDiagramWidget(this.selectedGeneLists);
#override
_VennState createState() => _VennState();
}
or this if you want the variable private
class VennDiagramWidget extends StatefulWidget {
final _selectedGeneLists;
VennDiagramWidget(this._selectedGeneLists);
List<GenesListObjIndexed> get selectedGeneLists => this._selectedGeneLists;
#override
_VennState createState() => _VennState();
}

How to call a function in a StatefulWidget from another StatefulWidget?

I am trying to call a function(addGeoPoint) from Map class in another function named onDragEnd of the class SwipeButton both of which is are stateful.
class Map extends StatefulWidget {
//Some Code
_MapState createState() => _MapState();
}
class _MapState extends State<Map> {
//Some Functions
void addGeoPoint() async{
}
File 2
class SwipeButton extends StatefulWidget {
// Some Code
#override
SwipeButtonState createState() => SwipeButtonState();
}
class SwipeButtonState extends State<SwipeButton>
with SingleTickerProviderStateMixin {
// Some functions
void _onDragEnd(DragEndDetails details) {
// I want to call the addGeoPoint() function here
}
}
To do so, I tried creating an instance of the class Map as Map mapScreen = new Map and then access the function using mapScreen.addGeoPoint() but, I achieved no success. Any help to solve this problem would be appreciated.
You can use VoidCallBacks to communicate between Widgets:
Map:
class Map extends StatefulWidget {
//Some Code
_MapState createState() => _MapState();
}
class _MapState extends State<Map> {
//Some Functions
void addGeoPoint() async{
//do things
}
Widget buildSwipeButton() {
...
...
return SwipeButton(
onAddGeoPoint: addGeoPoint,
);
}
SwipeButton:
class SwipeButton extends StatefulWidget {
final VoidCallback onAddGeopoint;
SwipeButton({this.onAddGeoPoint});
// Some Code
#override
SwipeButtonState createState() => SwipeButtonState();
}
class SwipeButtonState extends State<SwipeButton>
with SingleTickerProviderStateMixin {
// Some functions
void _onDragEnd(DragEndDetails details) {
// I want to call the addGeoPoint() function here
widget.onAddGeoPoint();
}
}
You can declare your widget like this
class YourWidget extends StatefulWidget {
final Function callback;
YourWidget({#required this.textButton});
#override
YourWidgetState createState() => YourWidgetState();
}
then you can pass de function like this in your stateful parent
YourWidget(
callback: (){}
)
ant then you can use in YourWidget like this in other widget or other function
widget.callback()