找不到参数 flash 的隐式值

Posted

技术标签:

【中文标题】找不到参数 flash 的隐式值【英文标题】:Could not find implicit value for parameter flash 【发布时间】:2011-10-17 01:12:14 【问题描述】:

我正在尝试将一些代码从 Play Framework Java 移植到 Play Framework Scala,但在移植标签时遇到了一些问题。

Java 版本中的相关标签检查 Flash 范围的内容并根据其值(错误、成功等)向用户创建通知。

我尝试创建一个 Scala 视图 (flag.scala.html):

@()(implicit flash:play.mvc.Scope.Flash)

@if(flash.get("error")) 
    <p style="color:#c00">
        @flash.get("error")
    </p>

我从main.scala.html 打来电话:

@views.Application.html.flag()

我得到的错误是:

文件 module:./tmp/generated/views.html.main.scala 不能 编译。引发的错误是:找不到隐含值 参数flash:play.mvc.Scope.Flash

对新标签的调用是正确的,就好像我用浏览器中显示的某个字符串替换了内容一样。

我确定这很愚蠢,但我被卡住了。有什么建议吗?

【问题讨论】:

【参考方案1】:

我不知道 Play 的详细信息,但这个编译错误是说你应该:

    在对flag()的调用中传递play.mvc.Scope.Flash的显式实例,

    views.Application.html.flag()(myFlash)
    

    使Flash 的隐式实例在调用flag() 的范围内可用。您可以通过导入某个对象 (import some.path.FlashImplicits._) 的内容或自己定义隐式实例来做到这一点,

    implicit val myFlash: play.mvc.Scope.Flash = ...
    ...
    views.Application.html.flag()
    

所以真正的问题变成了:你想从哪里得到这个Flash 实例?

【讨论】:

是的,第二个修复与 Play 完美配合:@()(implicit flash:play.mvc.Scope.Flash = play.mvc.Scope.Flash.current()) 的标签声明变量。谢谢一百万先生! 看起来你选择了选项#3:给隐式参数一个默认值。这也有效。请注意,您实际上并不需要在此处将其设为“隐式”,但这并没有什么坏处。乐于助人。【参考方案2】:

您不应自行创建“隐式闪存:Flash”的实现。只需在您的操作中添加“隐式请求”即可。

更多详情在页面末尾:https://github.com/playframework/Play20/wiki/ScalaSessionFlash

【讨论】:

我添加了隐式请求,但它不起作用..当我尝试使用隐式闪存时,它也不起作用..玩起来很麻烦,尤其是每个次要版本都有变化跨度> 【参考方案3】:

Ivan 提出了正确的建议,添加了“隐式请求”。但是,他的链接似乎已过时。如果您想要更明确的解释,请在此处查看我对类似问题的回答:

How to pass flash data from controller to view with Play! framework

【讨论】:

【参考方案4】:

我有同样的问题,但查看文档我发现以下内容:

如果错误“找不到参数 flash 的隐含值”: play.api.mvc.Flash' 被提出然后这是因为你的动作没有 导入请求对象。添加“隐式请求=>”

当然,如果您有如下嵌套视图,则隐式 Flash 必须出现在每个视图中:

@(implicit flash: Flash)

@main()<h1>hello</h1>


此视图不使用 flash 作用域,但如果 main 使用它,则应在使用 main 的视图中声明,因为编译器会报错。

来源:http://www.playframework.com/documentation/2.1.1/ScalaSessionFlash

【讨论】:

以上是关于找不到参数 flash 的隐式值的主要内容,如果未能解决你的问题,请参考以下文章

找不到参数 e 的隐式值

Scala 类型参数化,Shapeless - 找不到参数 Generic 的隐式值

找不到参数的隐式值

找不到参数 enc 的隐式值:CsvEncoder[Shape]

找不到参数映射器的隐式值

akka-http:找不到参数解组的隐式值