小编Vas*_*Vas的帖子

使用Dagger 2进行方法注射

我没有设法使用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)

如何在组件内指定哪种晚餐是哪种?

java android dependency-injection dagger-2

34
推荐指数
2
解决办法
1万
查看次数

具有命名参数的kotlin中的Dagger 2构造函数注入

我有这种依赖:

@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 dependency-injection kotlin dagger-2

25
推荐指数
1
解决办法
1万
查看次数

什么是android:includeFontPadding for?

你可以android:includeFontPadding="false"用来摆脱一个默认的填充TextView.Android文档说这个属性:

为上升器和下降器留出足够的空间,而不是严格使用字体上升和下降.

问题:

  • 以上是什么意思?这个填充用于什么?
  • 把它关掉是不是很糟糕?为什么?

android textview android-xml

14
推荐指数
1
解决办法
6146
查看次数

有人可以一劳永逸地解释不能调用determinVisibility() - 从未看到pid的连接

我目前正致力于通过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意思吗?我评价过了吗?我该怎么调试呢?

任何提示都表示赞赏.

编辑:我已经解决了原始问题,但我仍然希望了解该行的含义.赏金.

javascript android chromium android-webview d3.js

11
推荐指数
1
解决办法
6146
查看次数

在 PHP 中使用 saveXML 保存 CDATA

我编写了一个简短的 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>&lt;![CDATA[whatever]]&gt;</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)

php xml

4
推荐指数
1
解决办法
3028
查看次数

尽管上课,仍然会有警告

我正在使用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)

java android proguard

4
推荐指数
1
解决办法
681
查看次数

使用范围时依赖项注入的顺序

我当前正在尝试找出Dagger2。我正在尝试设置4个范围:App,User,Activity,Fragment。用户和活动组件是App的子组件。Fragment是一个以Activity为依存关系的组件。

假设我的UserSettingsActivity需要一个工具栏(由ActivityModule提供)和一个UserProfile(由UserModule提供)。在从数据库中请求之前,我不会获得UserProfile,而可以立即提供工具栏。因此,注入的顺序是先进入ActivityComponent,然后再进入UserComponent。我在活动中有2个@Inject字段,一个用于工具栏,一个用于UserProfile。我希望匕首会知道依赖关系来自不同的模块,但是似乎抱怨当注入ActivityComponent时无法提供UserProfile。显然,ActivityModule无法提供它,但是为什么不建立UserModule提供的UserProfile的连接呢?

android dependency-injection dagger-2

4
推荐指数
1
解决办法
802
查看次数

使用 testImplementation project(:deepestModule) 在另一个模块中测试时未解析的引用

我有一个多模块项目设置。在测试的时候,我发现我一直在重新定义每个模块中的一些模拟。所以我希望在最深的模块中定义我的模拟并在外部模块中重用它

我做了什么:

  1. 我将模拟定义放入测试源集 val mock = Mock(val id: String = "blah")
  2. 调整了外部模块构建文件说 testImplementation project(:deepestModule)
  3. 在外部模块测试中,我像这样引用模拟 assertThat(mock.id).isEqualTo("blah")

没有编译错误,但是当我运行外部测试时,构建失败,对模拟的引用未解析。

这有什么窍门吗?

unit-testing gradle kotlin

3
推荐指数
1
解决办法
770
查看次数

从Java类继承的Kotlin类是否也继承自Any?

从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)

inheritance kotlin

2
推荐指数
1
解决办法
326
查看次数

Gradle 无法解析来自另一个模块的引用

我有一个包含以下模块的项目:

  • 应用程序
  • 设备

应用程序取决于设备。设备包含应用引用的 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)

gradle kotlin android-studio-3.0

1
推荐指数
1
解决办法
3141
查看次数