Articles of 科特林

将Android Studio升级到3.1.0后,Android支持插件错误

我使用Kotlin和数据绑定为我的项目,在最近升级到Android Studio 3.1.0之后我经常在Android支持插件中看到很多exception: 无法初始化类android.databinding.tool.ext.ExtKt java.lang.NoClassDefFoundError:无法在android.databinding.tool.reflection.ModelClass.getTypeName(ModelClass.java:688)初始化类android.databinding.tool.ext.ExtKt )在android.dsduding.tool.MollClass的android.databinding.tool.reflection.ModelClass.findSetter(ModelClass.java:614)的android.databinding.tool.reflection.ModelClass.equals(ModelClass.java:694)处。 findGetterOrField(ModelClass.java:523)位于com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistryImpl.getReferences的com.android.tools.idea.lang.databinding.DataBindingXmlReferenceContributor $ 2.getReferencesByElement(DataBindingXmlReferenceContributor.java:196) (ReferenceProvidersRegistryImpl.java:135)位于com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersReg的com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistryImpl.mapNotEmptyReferencesFromProviders(ReferenceProvidersRegistryImpl.java:123)。 istryImpl.doGetReferencesFromProviders(ReferenceProvidersRegistryImpl.java:102)位于com.intellij.psi.impl.source.resolve.reference的com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry.getReferencesFromProviders(ReferenceProvidersRegistry.java:59)。位于org.intellij.plugins.intelliLang.references.InjectedReferencesContributor.getInjectedReferences(InjectedReferencesContributor)的com.android.tools.idea.lang.databinding.DataBindingPsiElement.getReferences(DataBindingPsiElement.java:32)中的ReferenceProvidersRegistry.getReferencesFromProviders(ReferenceProvidersRegistry.java:53)。 java:56)at com.android上的com.intellij.psi.impl.PsiElementBase.accept(PsiElementBase.java:274)中的org.intellij.plugins.intelliLang.references.InjectedReferencesInspection $ 1.visitElement(InjectedReferencesInspection.java:40)。 com.android.tools.idea.lang.databinding.psi.impl.PsiDbR​​efExprImpl.accept上的tools.idea.lang.databinding.psi.impl.PsiDbExprImpl.accept(PsiDbExprImpl.java:43)(PsiDbR​​efExprImpl.ja va:42)com.intellij.codeInspection.InspectionEngine.acceptElements(InspectionEngine.java:82)at com.intellij.codeInspection.InspectionEngine.createVisitorAndAcceptElements(InspectionEngine.java:70)at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass位于com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:133)的com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda $ inspectInjectedPsi $ 6(LocalInspectionsPass.java:338)中的.doInspectInjectedPsi(LocalInspectionsPass.java:750) at com.intellij.concurrency.ApplierCompleter.tryToExecAllList(ApplierCompleter.java:223)at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:151)at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl) .java:1125)at com.intellij.concurrency.ApplierCompleter.lambda $ wrapInReadActionAndIndicator $ 1(ApplierCompleter.java:105)at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun( Core.ProgressManager。 .intellij.concurrency.ApplierCompleter.wrapInReadActionAndIndicator(ApplierCompleter.java:116)at com.intellij.concurrency.ApplierCompleter.lambda $ compute $ 0(ApplierCompleter.java:96)at com.intellij.openapi.application.impl.ReadMostlyRWLock.executeByImpatientReader( ReadMostlyRWLock.java:143)at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:229)at com.intellij.concurrency.ApplierCompleter.compute(ApplierCompleter.java:96)at java.util.concurrent .countedCompleter.exec(CountedCompleter.java:731),java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289),java.util.concurrent.ForkJoinPool,$ WorkQueue.pollAndExecCC(ForkJoinPool.java:1190)。 util.concurrent.Fork JoinPool.helpComplete(ForkJoinPool.java:1879)java.util.concurrent.ForkJoinPool.awaitJoin(ForkJoinPool.java:2045)java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:390)java.util.concurrent .ForkJoinTask.join(ForkJoinTask.java:719)位于com.intellij的com.intellij.concurrency.JobLauncherImpl.invokeConcurrentlyUnderProgress(JobLauncherImpl.java:65)的java.util.concurrent.ForkJoinPool.invoke(ForkJoinPool.java:2616)。 concurrency.JobLauncher.invokeConcurrentlyUnderProgress(JobLauncher.java:57)at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.inspectInjectedPsi(LocalInspectionsPass.java:341)at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.inspect(LocalInspectionsPass。 java:231)at […]

genericstypes和多态性

我有BaseFragment : public abstract class BaseFragment extends Fragment implements BaseMvpView { private BasePresenter presenter; protected void syncLifeCycle(BasePresenter presenter) { this.presenter = presenter; this.presenter.onCreate(); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); //noinspection unchecked presenter.onAttachView(this); //it works with a warning } @Override public void onResume() { super.onResume(); presenter.onResume(); } @Override public void […]

Kotlin属性:“属性的types参数必须在其接收器types中使用”

我有以下简单的Kotlin扩展function: // Get the views of ViewGroup inline val ViewGroup.views: List get() = (0..childCount – 1).map { getChildAt(it) } // Get the views of ViewGroup of given type inline fun ViewGroup.getViewsOfType() : List { return this.views.filterIsInstance() } 此代码编译并正常工作。 但是,我希望函数getViewsOfType是一个属性,就像views 。 Android Studio甚至建议它。 我让AS进行重构,它会生成以下代码: inline val ViewGroup.viewsOfType: List get() = this.views.filterIsInstance() 但是这段代码没有编译。 它会导致错误:“属性的types参数必须在其接收器types中使用” 这是什么问题? 搜索有关此错误的帮助似乎不会导致答案。

Kotlin:安全的lambdas(没有内存泄漏)?

在阅读了关于内存泄漏的这篇文章之后,我想知道在Kotlin Android项目中使用lambdas是否安全。 确实,lambda语法让我更容易编程,但内存泄漏怎么样? 作为问题的一个例子,我从我的一个项目中获取了一段代码,在那里我构建了一个AlertDialog。 此代码位于项目的MainActivity类中。 fun deleteItemOnConfirmation(id: Long) : Unit { val item = explorerAdapter.getItemAt(id.toInt()) val stringId = if (item.isDirectory) R.string.about_to_delete_folder else R.string.about_to_delete_file val dialog = AlertDialog.Builder(this). setMessage(String.format(getString(stringId), item.name)).setPositiveButton( R.string.ok, {dialog: DialogInterface, id: Int -> val success = if (item.isDirectory) ExplorerFileManager.deleteFolderRecursively(item.name) else ExplorerFileManager.deleteFile(item.name) if (success) { explorerAdapter.deleteItem(item) explorerRecyclerView.invalidate() } else Toast.makeText(this@MainActivity, R.string.file_deletion_error, Toast.LENGTH_SHORT).show() }).setNegativeButton( R.string.cancel, […]

Kotlin:const val vs val

我理解在Kotlin中const val用于声明常量, val用于readonly属性。 但是,我想知道以下情况,哪一个更适合使用。 假设我有一个片段需要一个密钥用于saveInstanceState和restoreInstanceState 。 我想知道以下两个选项中哪一个更好: 选项1: class MyFragment { private val MY_KEY = “my_key” … } 选项2: private const val MY_KEY = “my_key” // declared in the same file. class MyFragment { … } 我更喜欢#option 2,因为它清楚地表明MY_KEY是一个常量,并且值是在编译时确定的。 但是,由于它是在顶层声明的,因此需要在编译的java代码中创建一个类,即MyFragmentKt (假设文件名是MyFragment.kt )。 在#option 1中,没有生成额外的类,虽然MY_KEY的值将在运行时分配而不是常量,但在这种特定情况下它的使用方式没有区别。 所以虽然我个人更喜欢#option 2,但我的分析让我觉得#option 1并不差,如果不是更好的话。 我只是想知道其他开发人员如何考虑这个问题以及#option 2是否还有其他任何我没有想过的好处。 谢谢。

目前不支持Gradle项目的自动库版本更新。 请手动更新build.gradle

我在我的building.gradle中有这个 buildscript { ext.kotlin_version = ‘1.1.2-4’ ext.kotlin_version = ‘1.1.2’ repositories { jcenter() } dependencies { classpath ‘com.android.tools.build:gradle:2.3.3’ classpath “org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version” } 并总是告诉我这个 Outdated Kotlin Runtime Your version of Kotlin runtime in ‘kotlin-stdlib-1.1.2’ library is 1.1.2, while plugin version is 1.1.2-release-Studio2.3-5. Runtime library should be updated to avoid compatibility problems.

如何在Kotlin中发出API请求?

我对Kotlin和API一般都是新手,并且找不到使用这种语言创建API请求的语法。 我正在创建一个网站的移动版本,所以我使用Android Studio为已经建立的后端创建一个新的UI。 创建请求的步骤和语法是什么? 非常感谢任何帮助。

Kotlin – 如何决定“lateinit”和“nullable variable”?

我对lateinit和nullablevariables感到困惑,哪一个用于variables。 lateinit var c: String var d: String? = null c = “UserDefinedTarget” // if not added initialisation for c than throws UninitializedPropertyAccessException if (c == “UserDefinedTarget”) { //do some stuff. } //not throws any exception whether d is initialise or not. if(d == “UserDefinedTarget”) { //do some stuff }

是否像Kotlin中的#region #endregion一样有语法?

我知道我可以使用#region #endregion来包围C#中的代码片段,Kotlin中是否有类似的语法? 谢谢! #region MyRegion protected void Page_Load(object sender, EventArgs e) { } #endregion

Kotlin中的variables,与Java的差异:’var’与’val’?

我正在努力学习Kotlin 。 与Java相比,Kotlin中的val , var和internal是什么? 在Java中: RadioGroup radioGroup; RadioButton button; Button submit; 转换后显示: internal var radioGroup: RadioGroup internal var button: RadioButton internal var submit: Button