我没有设法使用Dagger 2找到关于方法注入的好解释/示例.有人可以帮我理解吗?
例:
@Inject
public Dinner makeDinner(Pasta pasta, Sauce sauce) {
mPan.add(pasta);
mPan.add(sauce);
return mPan.cookDinner();
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我用我的方法注释@Inject,我是否正确假设方法签名中的参数将从对象图中注入定义的对象?我如何在我的代码中使用此方法呢?当我进行方法调用时,它仍然期望我提供所有参数,这会破坏目的.
更新:
因此,根据我的理解,如果我打电话DinnerComponent.dinner(),可以使用Dinner对象,假设我的DinnerComponent设置如下:
@Component(modules = DinnerModule.class)
public interface DinnerComponent {
Dinner dinner();
}
Run Code Online (Sandbox Code Playgroud)
我的DinnerModule设置如下:
@Module
public class DinnerModule {
public DinnerModule() {}
@Provides
Pasta providePasta() { return new Pasta(); }
@Provides
Sauce provideSauce() { return new Sauce(); }
}
Run Code Online (Sandbox Code Playgroud)
如果我想要我的晚餐炒得怎么样?那么让我们介绍一下这个方法:
@Inject
public Dinner makeDinner(Pasta pasta, Sauce sauce) {
mPan.add(pasta);
mPan.add(sauce);
return mPan.fryDinner();
}
Run Code Online (Sandbox Code Playgroud)
如何在组件内指定哪种晚餐是哪种?
我有这种依赖:
@Singleton
class SpiceMix @Inject constructor(@field:[Named("oregano")] private val oregano: Spice,
@field:[Named("sage")] private val sage: Spice,
@field:[Named("rosemary")] private val rosemary: Spice)
Run Code Online (Sandbox Code Playgroud)
以及一个实现其依赖关系的模块:
@Module
class SpiceModule {
@Provides
@Named("oregano")
@Singleton
fun provideOregano(): Spice = Oregano()
@Provides
@Named("sage")
@Singleton
fun provideSage(): Spice = Sage()
@Provides
@Named("rosemary")
@Singleton
fun provideRosemary(): Spice = Rosemary()
Run Code Online (Sandbox Code Playgroud)
该SpiceMix然后在我的应用程序的不同位置注射.
但是,这不编译,我收到一个错误:
Spice cannot be provided without an @Provides-annotated method
Run Code Online (Sandbox Code Playgroud)
我认为@Named注释在我的构造函数签名中不起作用.我不太确定如何才能使它发挥作用.
注意:如果我抛弃Named注释并将构造函数参数的类型更改为其具体形式,则此编译很好.但是,Spice是一个接口,我需要它在我的测试中用于模拟目的.
我能做什么?
你可以android:includeFontPadding="false"用来摆脱一个默认的填充TextView.Android文档说这个属性:
为上升器和下降器留出足够的空间,而不是严格使用字体上升和下降.
问题:
我目前正致力于通过d3将数据绘制到webview中.当然,一旦我尝试重新加载图表并提供新数据,事情就会破裂.这条可爱的线条不断涌现:W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid.
我已经搜索了SO以获得解释,但似乎没有任何结论.人们只是建议在webview设置中打开DOM存储(这显然无法解决问题).我怀疑在重新加载图表和提供新数据之间存在竞争条件.我在我的WebViewClient中重写了onPageFinished()来调用监听器将数据加载到图表中,认为它可以解决竞争条件,但无济于事.
有人可以向我解释一下是什么W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid意思吗?我评价过了吗?我该怎么调试呢?
任何提示都表示赞赏.
编辑:我已经解决了原始问题,但我仍然希望了解该行的含义.赏金.
我编写了一个简短的 PHP 脚本来获取现有的 XML 文件,找到一个节点并将其更改为新值。新值必须包装到 CDATA 块中。这工作正常,但是 <> 字符被替换为其各自的 HTML 实体。这破坏了我在 Java 中的 XML 验证。
<?php
$fileName = "whatever";
$doc = new DOMDocument();
$doc->load('test.xml');
$doc->getElementsByTagName("SomeNode")->item(0)->nodeValue = "<![CDATA[".$fileName."]]>";
header('Content-type: text/xml');
$doc->save("test.xml");
echo $doc->saveXML();
?>
Run Code Online (Sandbox Code Playgroud)
这是新 test.xml 的来源:
<?xml version="1.0"?>
<Root>
<FirstNode>
<SomeNode><![CDATA[whatever]]></SomeNode>
</FirstNode>
</Root>
Run Code Online (Sandbox Code Playgroud)
我确实需要 <> 字符而不是它们的 HTML 实体。我怎样才能做到这一点?
更新:我按照建议使用了 createCDATASection() ,但是当我尝试将其保存为节点值时它不起作用(我只是得到一个空白页)。如果我将它附加到 DOM,它会起作用,但这对我没有好处。
$cdata = $doc->createCDATASection( 'whatever' ));
$doc->getElementsByTagName("SomeNode")->item(0)->nodeValue = $cdata;
Run Code Online (Sandbox Code Playgroud) 我正在使用Proguard缩小我的代码.我的策略是启用它,然后按照警告来保留它抱怨的任何内容.如果有外部库,我会尝试遵循作者提供的Proguard说明.许多指令包括-dontwarn标志.如果我禁用该-dontwarn标志,我将收到警告.如果我们通过-keep旗帜保留大多数课程,为什么还会出现警告?例:
-keep class javax.** { *; }
# for butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.AbstractProcessor
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.ProcessingEnvironment
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.lang.model.element.TypeElement
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.lang.model.element.Element
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.Filer
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.tools.JavaFileObject …Run Code Online (Sandbox Code Playgroud) 我当前正在尝试找出Dagger2。我正在尝试设置4个范围:App,User,Activity,Fragment。用户和活动组件是App的子组件。Fragment是一个以Activity为依存关系的组件。
假设我的UserSettingsActivity需要一个工具栏(由ActivityModule提供)和一个UserProfile(由UserModule提供)。在从数据库中请求之前,我不会获得UserProfile,而可以立即提供工具栏。因此,注入的顺序是先进入ActivityComponent,然后再进入UserComponent。我在活动中有2个@Inject字段,一个用于工具栏,一个用于UserProfile。我希望匕首会知道依赖关系来自不同的模块,但是似乎抱怨当注入ActivityComponent时无法提供UserProfile。显然,ActivityModule无法提供它,但是为什么不建立UserModule提供的UserProfile的连接呢?
我有一个多模块项目设置。在测试的时候,我发现我一直在重新定义每个模块中的一些模拟。所以我希望在最深的模块中定义我的模拟并在外部模块中重用它
我做了什么:
val mock = Mock(val id: String = "blah")testImplementation project(:deepestModule)assertThat(mock.id).isEqualTo("blah")没有编译错误,但是当我运行外部测试时,构建失败,对模拟的引用未解析。
这有什么窍门吗?
从Java类继承的Kotlin类是否也继承自Any?
如果我们有一个Java类Foo,以及一个继承自Foo的Kotlin类Bar,并且我们试图在Kotlin的MutableList中使用它,那么下面的工作应该如何呢?
class Class(items: MutableList<Bar> = mutableListOf()) {
var items: MutableList<Any> = items
}
Run Code Online (Sandbox Code Playgroud) 我有一个包含以下模块的项目:
应用程序取决于设备。设备包含应用引用的 NetworkComponent 类。进一步来说:
package com.some.package.ui.login;
import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import com.some.package.R
import com.some.package.device.network.NetworkComponent
import com.some.package.ui.terms.TermsActivity
class LoginActivity : AppCompatActivity(),
LoginViewModel.Navigator {
val loginViewModel by lazy { LoginViewModel(this, NetworkComponent()) }
Run Code Online (Sandbox Code Playgroud)
在 Android Studio 中一切正常。然而,当我尝试构建项目时,我遇到了构建错误:
e: /Users/android/some-app-android/app/src/main/kotlin/com/some/package/ui/login/LoginActivity.kt: (7, 27): Unresolved reference: network
e: /Users/android/some-app-android/app/src/main/kotlin/com/some/package/ui/login/LoginActivity.kt: (13, 55): Unresolved reference: NetworkComponent
[KOTLIN] deleting /Users/android/some-app-android/app/build/tmp/kotlin-classes/debug on error
[KOTLIN] deleting /Users/android/some-app-android/app/build/tmp/kotlin-classes/debug on error
:app:compileDebugKotlin FAILED
Run Code Online (Sandbox Code Playgroud)
这是 NetworkComponent 的样子:
package com.some.package.device.network
import com.some.package.domain.datasources.CodeValidator
import retrofit2.Retrofit
class NetworkComponent : CodeValidator {
val codeValidator: …Run Code Online (Sandbox Code Playgroud) android ×6
kotlin ×4
dagger-2 ×3
gradle ×2
java ×2
android-xml ×1
chromium ×1
d3.js ×1
inheritance ×1
javascript ×1
php ×1
proguard ×1
textview ×1
unit-testing ×1
xml ×1