【问题标题】:Undefined named 'context' while navigating导航时未定义的命名“上下文”
【发布时间】:2020-05-09 13:44:09
【问题描述】:
import 'package:flutter/material.dart';
import 'fruits_listing_card.dart';
import 'fruits_page.dart';

Map<String, Widget> fruits = {
  "banana": FruitsListingCards(
    fruitBGColor: 0xFFF8A8B5,
    fruitImagePath: 'images/fruits/banana.png',
    fruitName: 'Banana',
    fruitPrice: 'Rs. 105',
    fruitShortDescription: 'Ripe & Tasty',
    onTap: () {
      Navigator.push(context, MaterialPageRoute(builder: (context) => FruitsPage()),);
    },
  ),
}

// 第二个文件

import 'package:flutter/material.dart';
class FruitsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(),
      ),
    );
  }
}

这两个代码都在不同的文件中。 FruitsListingCards 是一个具有手势检测功能的小部件。 onTap 是一个带函数的参数。 我在主文件中使用 FruitsListingCards,每当用户点击它时,都应该转到 FruitsPage 屏幕。但错误是不允许我这样做。任何具有适当解释的解决方案都会对我有很大帮助。

编辑: 为了正确理解代码,请查看我的 repo: https://github.com/RaghavTheGreat1/fruits_delivery/tree/master/lib

【问题讨论】:

  • 你能为我们提供这些类的完整代码吗?能够看到这些类如何协同工作对我们来说很重要。请将您的课程拉入一个文件并在此处发布。
  • 上面列出的代码目前不在你的仓库中。
  • 我相信您可能只需要 BuildContext context 作为 onTap 函数的参数。然后,在你调用onTap 的地方,你可以在那里传递上下文。

标签: flutter dart screen navigator


【解决方案1】:

您必须提供一些上下文,以便它可以连接上一个屏幕和下一个屏幕。

您可以为此包装一个函数。

遵循最少的代码将帮助您更好地理解。

class DeleteWidget extends StatefulWidget {   
@override  
_DeleteWidgetState createState() => _DeleteWidgetState(); 
}

class FruitsPage extends StatelessWidget {   
final Function call;   
FruitsPage({this.call});   
@override   
Widget build(BuildContext context) {
        return Container(
          child: RaisedButton(
            child: Text("press"),
            onPressed: call,
          ),
        );   
} 
}

    class NewPage extends StatelessWidget {   
    @override   
    Widget build(BuildContext context) {
            return Scaffold(
              body: Center(
                child: Container(
                  child: Text("FruiysPage"),
                ),
              ),
            );   
} 
}




    callme(context) {   
Map<String, Widget> fruits = {
        "banana": FruitsPage(
          call: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => NewPage()),
            );
          },
        )   
};   
return fruits; 
}

【讨论】:

  • 使用上下文颤振可以识别屏幕,因此您需要在导航中使用上下文,因为使用该颤振将了解您想要从哪个屏幕导航到哪个屏幕屏幕。总之,要传递上下文,我们必须做那件事。如果对您有帮助,请接受我的回答。
  • 在 null 上调用了 getter 'visible'。接收者:null 尝试调用:可见我调试时失败了
  • 我认为我的情况比您的代码表达的要复杂。我主要使用水果字典的键来一一调用 FruitsListingCards。现在,如果我用函数包装字典,那么我将如何提取 FruitsListingCards?
  • 请通过我的回购并检查机制。如果可能,请分叉并拉出问题,以便我更好地理解..抱歉给您带来的麻烦,但我仍在学习。
【解决方案2】:

嗯,我自己解决了这个问题,即使其他人没有查看我在 GitHub 存储库中提交的代码,这也比其他人建议的要容易。

快速的解决方案是在 FruitsListingCards 的 GestureDetector 的匿名函数中添加Navigator.push(context, MaterialPageRoute(builder: (context) =&gt; fruitsPage));,然后返回 fruitsPage(这是一个以 Class 对象为参数的动态变量)。

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2020-02-25
    • 2018-09-14
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多