草庐IT

flutter - Scaffold.of 会找到远距离的 widget anestors 吗?

coder 2023-07-23 原文

我正在尝试了解有关 BuildContextScaffold.of() 的更多信息。

我了解到,当您显示 SnackBar 时,您通常需要添加一个 Builder 以获取您添加的脚手架“下”的上下文。

因此:

class MyScreen extends StatelessWidget {
   build(BuildContext context) {
    return Scaffold(

        body: Builder(
          builder: (context) =>
           RaisedButton(
                child: Text('push me'),
                onPressed: () => Scaffold.of(context).showSnackBar(
                    SnackBar(content: Text('this will work'))),
              ),
        ));
  }
}

我的问题是:如果 Scaffold.of() 获得最近的祖先,它通常不应该最终找到部件树更高的东西,例如SplashScreen 脚手架? 当我们拿走构建器并创建这个不正确的代码时:

class MyScreen extends StatelessWidget {
   build(BuildContext context) {
    return Scaffold(

        body: RaisedButton(
                child: Text('push me'),
                onPressed: () => Scaffold.of(context).showSnackBar(
                    SnackBar(content: Text('broken'))),
              ),
        ));
  }
}

然后我们得到标准错误 Scaffold.of() 在不包含脚手架的上下文中调用。 我/flutter (7750) 从传递给 Scaffold.of() 的上下文开始,找不到 Scaffold 祖先。

即使 BuildContext 中没有直接父 Scaffold,怎么可能根本找不到 Scaffold 祖先(例如 Grandparent 祖先)?我的应用程序中的所有先前页面都有脚手架,它们是否不再位于小部件树中?

我知道如果它找到一个 Scaffold 并呈现 SnackBar 我们将无法看到它,但我仍然不明白它为什么找不到。也许我误解了“祖先”的意思。

谢谢

最佳答案

BuildContext 表示一个特定小部件在小部件树中的位置。

因此,根据您使用的 BuildContext,调用 Scaffold.of(context) 的行为可能会有所不同。

在您的以下示例中:

class MyScreen extends StatelessWidget {
   build(BuildContext context) {
     return Scaffold(
       body: RaisedButton(
         child: Text('push me'),
         onPressed: () => Scaffold.of(context).showSnackBar(
           SnackBar(content: Text('this will work'))),
       ),
     ),
   );
  }
}

在这里,您使用的是 MyScreenBuildContext。问题是 MyScreen创建 Scaffold 的小部件。因此,MyScreenScaffold 的祖先,无法通过 Scaffold.of(context) 访问它。

关于flutter - Scaffold.of 会找到远距离的 widget anestors 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54705904/

有关flutter - Scaffold.of 会找到远距离的 widget anestors 吗?的更多相关文章

  1. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  2. ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html" - 2

    我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'

  3. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  4. ruby - 如何找到调用当前方法的方法 - 2

    如何找到调用此方法的位置?defto_xml(options={})binding.pryoptions=options.to_hifoptions&&options.respond_to?(:to_h)serializable_hash(options).to_xml(options)end 最佳答案 键入caller。这将返回当前调用堆栈。文档:Kernel#caller.例子[0]%rspecspec10/16|===================================================62=====

  5. ruby 代码 : why put colon in front of variable name (inside initialize method) - 2

    我遇到了一些Ruby代码,我试图理解为什么变量在initialize方法声明中的名称末尾有冒号。冒号有什么原因吗?attr_reader:var1,:var2definitialize(var1:,var2:)@var1=var1@var2=var2end 最佳答案 那些是关键字参数。您可以按名称而非位置使用它们。例如ThatClass.new(var1:42,var2:"foo")或ThatClass.new(var2:"foo",var1:42)Anarticleaboutkeywordargumentsbythoughtbot

  6. python - 帮我找到合适的 ruby​​/python 解析器生成器 - 2

    我使用的第一个解析器生成器是Parse::RecDescent,它的指南/教程很棒,但它最有用的功能是它的调试工具,特别是tracing功能(通过将$RD_TRACE设置为1来激活)。我正在寻找可以帮助您调试其规则的解析器生成器。问题是,它必须用python或ruby​​编写,并且具有详细模式/跟踪模式或非常有用的调试技术。有人知道这样的解析器生成器吗?编辑:当我说调试时,我并不是指调试python或ruby​​。我指的是调试解析器生成器,查看它在每一步都在做什么,查看它正在读取的每个字符,它试图匹配的规则。希望你明白这一点。赏金编辑:要赢得赏金,请展示一个解析器生成器框架,并说明它的

  7. ruby - 让 bundler 使用 http : instead of git:? - 2

    我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://

  8. ruby-on-rails - 撤消 "rails generate scaffold"后是否需要撤消 "db:migrate"? - 2

    我是RoR的新手,我正在学习MichaelHartl的教程(所以请随意更正我在您认为合适的地方使用的术语)。在第2章中,我通过运行以下行创建了一个Users表:$railsgeneratescaffoldUsername:stringemail:string$bundleexecrakedb:migrate然后,我运行了下面的代码来尝试创建一个Microposts表(但是,我拼错了没有“r”的Micropost!)...$railsgeneratescaffoldMiropostcontent:stringuser_id:integer$bundleexecrakedb:migrate

  9. ruby-on-rails - Rails 2.3.5 : How does one access code inside of lib/directory/file. rb? - 2

    我创建了一个文件,这样我就可以在lib/foo/bar_woo.rb中的许多模型之间共享一个方法。在bar_woo.rb中,我定义了以下内容:moduleBarWoodefhelloputs"hello"endend然后在我的模型中我正在做类似的事情:defMyModel解释器提示它期望bar_woo.rb定义Foo::BarWoo。《使用Rails进行敏捷Web开发》一书指出,如果文件包含类或模块,并且文件使用类或模块名称的小写形式命名,那么Rails将自动加载文件。因此我不需要它。定义代码的正确方法是什么,在我的模型中调用代码的正确方法是什么? 最佳答案

  10. ruby - 404 未找到,但可以从网络浏览器正常访问 - 2

    我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT

随机推荐