gpt4 book ai didi

reactjs - 在 React Native 上为 android 创建自定义 UI 组件失败。应用程序崩溃

转载 作者:行者123 更新时间:2023-12-03 13:29:07 24 4
gpt4 key购买 nike

由于 Facebook 登录按钮本身可用,我想要一个适用于 Android 的 React Native 包装组件。所以,我尝试着写它。但应用程序甚至在启动之前就崩溃了。我的 github 存储库是: https://github.com/lalith26/react-native-fb-login-android

我已完成以下操作:

  1. 我为 LoginButton Facebook 小部件创建了管理器:

https://github.com/lalith26/react-native-fb-login-android/blob/master/android/app/src/main/java/com/fbloginbutton2/FBLoginButtonManager.java

  • 我创建了一个扩展 MainReactPackage 的 ReactPackage:
  • https://github.com/lalith26/react-native-fb-login-android/blob/master/android/app/src/main/java/com/fbloginbutton2/FBLoginButtonReactPackage.java

  • 我在 MainActivity 中添加了新的 ReactPackage:
  • https://github.com/lalith26/react-native-fb-login-android/blob/master/android/app/src/main/java/com/fbloginbutton2/MainActivity.java#L29

  • 我包含了 facebook 登录 sdk 的 gradle 依赖项
  • https://github.com/lalith26/react-native-fb-login-android/blob/master/android/app/build.gradle#L28

  • 我用 JS 组件封装了 Native 组件:
  • https://github.com/lalith26/react-native-fb-login-android/blob/master/fblogin.js

  • 最后我使用了 JS 组件:
  • https://github.com/lalith26/react-native-fb-login-android/blob/master/index.android.js#L21

    我浏览了网页,发现 propTypes 是强制传递的。我也尝试过。但该应用程序在启动时崩溃。我看不到任何日志。所以,我无法找到问题的真正原因。我对按钮尝试了相同的步骤,效果很好。

    我是不是做错了什么?请帮忙..

    我通过logcat访问了模拟器的日志。它显示:

    E/AndroidRuntime( 2550): Process: com.fbloginbutton2, PID: 2550 E/AndroidRuntime( 2550): java.lang.ExceptionInInitializerError E/AndroidRuntime( 2550): at com.fbloginbutton2.FBLoginButtonManager.createViewInstance(FBLoginButtonManager.java:29) E/AndroidRuntime( 2550): at com.fbloginbutton2.FBLoginButtonManager.createViewInstance(FBLoginButtonManager.java:15) E/AndroidRuntime( 2550): at com.facebook.react.uimanager.ViewManager.createView(ViewManager.java:41) E/AndroidRuntime( 2550): at com.facebook.react.uimanager.NativeViewHierarchyManager.createView(NativeViewHierarchyManager.java:172) E/AndroidRuntime( 2550): at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute(UIViewOperationQueue.java:137) E/AndroidRuntime( 2550): at com.facebook.react.uimanager.UIViewOperationQueue$1.run(UIViewOperationQueue.java:574) E/AndroidRuntime( 2550): at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded(UIViewOperationQueue.java:622) E/AndroidRuntime( 2550): at com.facebook.react.uimanager.GuardedChoreographerFrameCallback.doFrame(GuardedChoreographerFrameCallback.java:32) E/AndroidRuntime( 2550): at com.facebook.react.uimanager.ReactChoreographer$ReactChoreographerDispatcher.doFrame(ReactChoreographer.java:114) E/AndroidRuntime( 2550): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:765) E/AndroidRuntime( 2550): at android.view.Choreographer.doCallbacks(Choreographer.java:580) E/AndroidRuntime( 2550): at android.view.Choreographer.doFrame(Choreographer.java:549) E/AndroidRuntime( 2550): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) E/AndroidRuntime( 2550): at android.os.Handler.handleCallback(Handler.java:739) E/AndroidRuntime( 2550): at android.os.Handler.dispatchMessage(Handler.java:95) E/AndroidRuntime( 2550): at android.os.Looper.loop(Looper.java:135) E/AndroidRuntime( 2550): at android.app.ActivityThread.main(ActivityThread.java:5221) E/AndroidRuntime( 2550): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime( 2550): at java.lang.reflect.Method.invoke(Method.java:372) E/AndroidRuntime( 2550): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) E/AndroidRuntime( 2550): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) E/AndroidRuntime( 2550): Caused by: null E/AndroidRuntime( 2550): at com.facebook.internal.Validate.sdkInitialized(Validate.java:99) E/AndroidRuntime( 2550): at com.facebook.FacebookSdk.getCallbackRequestCodeOffset(FacebookSdk.java:735) E/AndroidRuntime( 2550): at com.facebook.internal.CallbackManagerImpl$RequestCodeOffset.toRequestCode(CallbackManagerImpl.java:109) E/AndroidRuntime( 2550): at com.facebook.login.widget.LoginButton.(LoginButton.java:58) E/AndroidRuntime( 2550): ... 21 more W/ActivityManager( 1327):
    Force finishing activity com.fbloginbutton2/.MainActivity E/EGL_emulation( 1373): tid 1373: eglCreateSyncKHR(1181): error 0x3004 (EGL_BAD_ATTRIBUTE)

    最佳答案

    我发现很难找到有关该问题的简单示例或文档,因此这里是我的代码示例,扩展了 KenBurnsView ( https://github.com/flavioarfaria/KenBurnsView ),我希望这个示例简单且有帮助:

    KenBurnsViewManager.Java:

    import com.flaviofaria.kenburnsview.KenBurnsView;

    import com.facebook.react.uimanager.SimpleViewManager;
    import com.facebook.react.uimanager.ThemedReactContext;
    import com.facebook.react.uimanager.ReactProp;

    import java.io.InputStream;

    import android.graphics.drawable.Drawable;
    import android.util.Log;

    public class KenBurnsViewManager extends SimpleViewManager<KenBurnsView> {

    public static final String REACT_CLASS = "KenBurnsView";
    private ThemedReactContext ctx;

    @Override
    public String getName() {
    return REACT_CLASS;
    }

    @Override
    protected KenBurnsView createViewInstance(ThemedReactContext context) {
    ctx = context;
    return new KenBurnsView(context);
    }

    @ReactProp(name = "source")
    public void setSource(KenBurnsView view, String source) {
    try {
    InputStream ims = ctx.getAssets().open("images/" + source);
    Drawable d = Drawable.createFromStream(ims, null);
    view.setImageDrawable(d);
    } catch (Exception ex) {
    Log.e("KenBurnsView", "setSource", ex);
    }
    }
    }

    KenBurnsViewPackage.Java:

    import com.facebook.react.ReactPackage;
    import com.facebook.react.bridge.JavaScriptModule;
    import com.facebook.react.bridge.NativeModule;
    import com.facebook.react.bridge.ReactApplicationContext;
    import com.facebook.react.uimanager.ViewManager;

    import java.util.Collections;
    import java.util.List;
    import java.util.Arrays;
    import java.util.ArrayList;

    public class KenBurnsViewPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(
    ReactApplicationContext reactContext) {

    List<NativeModule> modules = new ArrayList<>();

    return modules;
    }

    @Override
    public List<ViewManager> createViewManagers(
    ReactApplicationContext reactContext) {
    return Arrays.<ViewManager>asList(
    new KenBurnsViewManager()
    );
    }

    @Override
    public List<Class<? extends JavaScriptModule>> createJSModules() {
    return Collections.emptyList();
    }
    }

    更新MainActivity.Java:

    mReactInstanceManager = ReactInstanceManager.builder()
    .setApplication(getApplication())
    .setBundleAssetName("index.android.bundle")
    .setJSMainModuleName("index.android")
    .addPackage(new MainReactPackage())
    .addPackage(new KenBurnsViewPackage()) // <- add package
    .setUseDeveloperSupport(BuildConfig.DEBUG)
    .setInitialLifecycleState(LifecycleState.RESUMED)
    .build();

    更新 android/app/build.gradle:

    dependencies {
    compile fileTree(dir: "libs", include: ["*.jar"])
    compile "com.android.support:appcompat-v7:23.0.1"
    compile "com.facebook.react:react-native:0.16.+"
    compile "com.flaviofaria:kenburnsview:1.0.6"
    }

    KenBurnsView.js:

    var { requireNativeComponent, PropTypes, View } = require('react-native');

    var iface = {
    propTypes: {
    ...View.propTypes,
    source: PropTypes.string,
    },
    };

    module.exports = requireNativeComponent('KenBurnsView', iface);

    就是这样,现在您可以添加新的自定义 KenBurnsView 组件,例如:

    var KenBurnsView = require('./KenBurnsView');
    .
    .
    .
    <KenBurnsView source={'image.jpg'} style={{width:null, height: 300}}/>

    关于reactjs - 在 React Native 上为 android 创建自定义 UI 组件失败。应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32829173/

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