Hemabh
Hemabh

Reputation: 463

"Undefined name 'context'. Try correcting the name to one that is defined, or defining the name." Flutter

This is a snippet of my widgets.dart file where I defined a widget called see_all_cards and its only purpose is to show an extended list of all cards that I was initially displaying. It should just redirect to Trending.dart. That's my main goal here.

Widget see_all_cards(){
  return  Container(
        child: FlatButton(
                  child: Text(
                    "See all (43)",               
                    style: TextStyle(
                      color: Theme.of(context).accentColor, // error
                    ),
                    ),

                  onPressed: (){
                    Navigator.push(
                      context,  // error
                      MaterialPageRoute(
                        builder: (BuildContext context){
                          return trending();     
                        },
                      ),
                    );
                  },       
        )
  );
}

The following segment is my main page. I've called SlowlyApp from void main.

class SlowlyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SlowlyApp',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Search',
            style: TextStyle(
              color: Color.fromRGBO(0,0,0,1),
            ),
          ),
          backgroundColor: Color.fromRGBO(225,225,0,1),         
          actions: <Widget>[
            IconButton(
              icon: 
                Icon(Icons.search), 
                onPressed: (){
                  showSearch(context: context, delegate: data_search());
                }
            ),
          ],
        ),
        body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[       
            smallgap(), 
            current_cards_heading(),
            current_cards(),
            see_all_cards(),
            smallgap(),
          ],
        ),
      ),
    );   
  }
}

Upvotes: 3

Views: 48920

Answers (2)

Sarthak Raval
Sarthak Raval

Reputation: 1291

I also get this error to solve this way

it's the main file container called my widgets _buildFoodItem define context with parameters

 Container(
        height: MediaQuery.of(context).size.height - 185.0,
        decoration: const BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.only(
            topLeft: Radius.circular(75.0),
          ),
        ),
        child: ListView(
          primary: true,
          padding: const EdgeInsets.only(left: 25.0, right: 20.0),
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.only(top: 45.0),
              child: Container(
                height: MediaQuery.of(context).size.height - 300.0,
                child: ListView(children: [
                  _buildFoodItem(context, 'assets/images/plate1.png',
                      'Slazmon bowl', '₹ 150:00'),
                  _buildFoodItem(context, 'assets/images/plate2.png',
                      'Spring bowl', '₹ 120:00'),
                  _buildFoodItem(context, 'assets/images/plate3.png',
                      'Chikz bowl', '₹ 100:00'),
                  _buildFoodItem(context, 'assets/images/plate4.png',
                      'Berry Bowl', '₹ 199:00'),
                  _buildFoodItem(context, 'assets/images/plate5.png',
                      'Greezy bowl', '₹ 170:00'),
                ]),
              ),
            )
          ],
        ),
      ),

this is my widget _buildFoodItem check the context

Widget _buildFoodItem(  
BuildContext context, String imgPath, String foodName, String price) {
  return Padding(padding: const EdgeInsets.only(
       top: 10.0, left: 10.0, right: 10.0),
       child: InkWell(
      onTap: () {
        Navigator.push(
            context,
            (MaterialPageRoute(
              builder: (context) => FoodDetailsPage(
                heroTag: imgPath,
                foodName: foodName,
                foodPrice: price,
              ),
            )));
      },

    ))
  }
)

Upvotes: 0

see_all_cards should expect context as parameter. You only have context in your main widget's build method

Widget see_all_cards(BuildContext context){
  return  Container(
        child: FlatButton(
                  child: Text(
                    "See all (43)",               
                    style: TextStyle(
                      color: Theme.of(context).accentColor, // error
                    ),
                    ),

                  onPressed: (){
                    Navigator.push(
                      context,  // error
                      MaterialPageRoute(
                        builder: (BuildContext context){
                          return trending();     
                        },
                      ),
                    );
                  },       
        )
  );
}

And then you can call passing the context.

class SlowlyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SlowlyApp',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Search',
            style: TextStyle(
              color: Color.fromRGBO(0,0,0,1),
            ),
          ),
          backgroundColor: Color.fromRGBO(225,225,0,1),         
          actions: <Widget>[
            IconButton(
              icon: 
                Icon(Icons.search), 
                onPressed: (){
                  showSearch(context: context, delegate: data_search());
                }
            ),
          ],
        ),
        body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[       
            smallgap(), 
            current_cards_heading(),
            current_cards(),
            see_all_cards(context),
            smallgap(),
          ],
        ),
      ),
    );   
  }
}

Upvotes: 7

Related Questions