gpt4 book ai didi

android - NativeScript:扩充 tns-platform-declarations

转载 作者:搜寻专家 更新时间:2023-10-30 22:01:16 29 4
gpt4 key购买 nike

在我的 NativeScript 项目中,我想包含来自 Android 支持库的 RecyclerView。我将依赖项包含在 app/App_Resources/Android/app.gradle 中:

// Uncomment to add recyclerview-v7 dependency
dependencies {
compile 'com.android.support:recyclerview-v7:+'
}

来自 git issue#2295和其他相关问题,我读到可以包含 tns-platform-declarations 以提供原生 android/ios 库的定义文件。所以我安装了它们并关注了tns platform declarations documentation

我想编译以下示例 fragment :

import { ContentView } from "ui/content-view";

declare var android: any;

export class OptimizedListView extends ContentView {

private _android: android.support.v7.widget.RecyclerView;

public _createUI() {
this._android = new android.support.v7.widget.RecyclerView(this._context);
}

};

像上面那样声明 var android 会清除 RecyclerView 的第二个引用。但是 RecyclerView 的 top reference 上仍然存在以下错误:

message: 'Namespace 'android.support.v7.widget' has no exported member 'RecyclerView'.'

我也尝试过声明 RecyclerView 类但没有成功:

export declare class RecyclerView extends ContentView {}

我知道,tns-platform-declarationsandroid.support.v7.widget 之前都有定义。

将“noEmitOnError”设置为 false 的解决方法感觉不对。

那么我如何将此声明扩展到 android.support.v7.widget.RecyclerView 而不会出现编译问题?

版本:

  • "nativescript-dev-typescript": "^0.3.2"
  • "tns-platform-declarations": "^2.4.0-2016-09-28-1"
  • “ typescript ”:“^2.1.1”
  • "tns-core-modules": "下一步"

最佳答案

最后我没有去 tns-platform-declarations完全没有,因为性能非常糟糕(特别是如果您的开发机器中有 <= 8GB RAM)。

我的解决方案是定义一个自己的 my-typings.d.ts文件(例如在项目根目录中),我在其中定义了扩充类型 RecyclerView .与 tsconfig.json默认它应该被 tsc 自动捕获.否则exclude/include , 或 files可以添加表达式。

然后你可以放置一个/// <reference path="path/to/RecyclerView/file.d.ts" />在里面,所以下面的ambient global namespace可以通过 Typescript 编译器找到。

declare namespace android {

namespace view {
namespace ViewGroup {
namespace LayoutParams {
const MATCH_PARENT;
const WRAP_CONTENT;
}
}
class ViewGroup {

}
}

namespace support.v7.widget {

namespace RecyclerView {
type AdapterImpl = {
onCreateViewHolder(parent: android.view.ViewGroup, viewType: number): ViewHolder;
onBindViewHolder(holder: android.support.v7.widget.RecyclerView.ViewHolder, position: number): void;
getItemCount(): number
};

class Adapter {
static extend(AdapterImpl): { new () }
}

class LayoutParams {
constructor(width: any, height: any);
}

class ViewHolder {
static extend: any;
}
}

class RecyclerView {
constructor(context: any);

setAdapter(Adapter): void;
setLayoutManager(LinearLayoutManager): void;
}

class LinearLayoutManager {
constructor(context: any);
}

}
}

基本上,命名空间可用于模拟嵌套对象属性(例如 android.view.xxx )。如果内部类是用 Java 定义的,这也是这种方式(Typescript 似乎禁止嵌套 class 语句)。

在实际使用类型的情况下,我还必须定义一个与 namespace 同名的类(如 android.view.ViewGroup 中)。否则你会得到上面的错误

no exported member xxx

,即使类类型显式声明为 export (这不是必需的,因为您已经全局声明了命名空间)。

对于使用 extend 扩展 native Java 类型的特殊情况,我为相关类定义了一个静态方法,如 static extend(AdapterImpl): { new () } ,其返回类型可以用 new 实例化.

希望这对其他有类似问题的人有所帮助。

关于android - NativeScript:扩充 tns-platform-declarations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40702610/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com