diff --git a/doric-android/doric/src/main/java/pub/doric/extension/bridge/DoricBridgeExtension.java b/doric-android/doric/src/main/java/pub/doric/extension/bridge/DoricBridgeExtension.java index beebb4f8..4df0ea03 100644 --- a/doric-android/doric/src/main/java/pub/doric/extension/bridge/DoricBridgeExtension.java +++ b/doric-android/doric/src/main/java/pub/doric/extension/bridge/DoricBridgeExtension.java @@ -45,30 +45,42 @@ public class DoricBridgeExtension { final DoricContext context = DoricContextManager.getContext(contextId); DoricMetaInfo pluginInfo = context.getDriver().getRegistry().acquirePluginInfo(module); if (pluginInfo == null) { + String errorMsg = String.format("Cannot find plugin class:%s", module); context.getDriver().getRegistry().onLog( Log.ERROR, - String.format("Cannot find plugin class:%s", module)); + errorMsg); + new DoricPromise(context, callbackId) + .reject(new JavaValue(errorMsg)); return new JavaValue(false); } final DoricJavaPlugin doricJavaPlugin = context.obtainPlugin(pluginInfo); if (doricJavaPlugin == null) { + String errorMsg = String.format("Cannot obtain plugin instance:%s,method:%s", module, methodName); context.getDriver().getRegistry().onLog( Log.ERROR, - String.format("Cannot obtain plugin instance:%s,method:%s", module, methodName)); + errorMsg); + new DoricPromise(context, callbackId) + .reject(new JavaValue(errorMsg)); return new JavaValue(false); } final Method method = pluginInfo.getMethod(methodName); if (method == null) { + String errorMsg = String.format("Cannot find plugin method in class:%s,method:%s", module, methodName); context.getDriver().getRegistry().onLog( Log.ERROR, - String.format("Cannot find plugin method in class:%s,method:%s", module, methodName)); + errorMsg); + new DoricPromise(context, callbackId) + .reject(new JavaValue(errorMsg)); return new JavaValue(false); } DoricMethod doricMethod = method.getAnnotation(DoricMethod.class); if (doricMethod == null) { + String errorMsg = String.format("Cannot find DoricMethod annotation in class:%s,method:%s", module, methodName); context.getDriver().getRegistry().onLog( Log.ERROR, - String.format("Cannot find DoricMethod annotation in class:%s,method:%s", module, methodName)); + errorMsg); + new DoricPromise(context, callbackId) + .reject(new JavaValue(errorMsg)); return new JavaValue(false); } Callable callable = new Callable() { @@ -100,6 +112,8 @@ public class DoricBridgeExtension { context.getDriver().getRegistry().onException( context, t instanceof Exception ? (Exception) t : new RuntimeException(t)); + new DoricPromise(context, callbackId) + .reject(new JavaValue(t.getMessage())); } @Override diff --git a/doric-android/doric/src/main/java/pub/doric/shader/ErrorHintNode.java b/doric-android/doric/src/main/java/pub/doric/shader/ErrorHintNode.java new file mode 100644 index 00000000..78d2d5fe --- /dev/null +++ b/doric-android/doric/src/main/java/pub/doric/shader/ErrorHintNode.java @@ -0,0 +1,62 @@ +package pub.doric.shader; +/* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import android.graphics.Color; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.TextView; + +import pub.doric.DoricContext; +import pub.doric.extension.bridge.DoricPlugin; + +/** + * @Description: pub.doric.shader + * @Author: pengfei.zhou + * @CreateDate: 2021/6/22 + */ +@DoricPlugin(name = "ErrorHint") +public class ErrorHintNode extends ViewNode { + private String hintText = "Error hint"; + + public ErrorHintNode(DoricContext doricContext) { + super(doricContext); + } + + @Override + protected FrameLayout build() { + FrameLayout frameLayout = new FrameLayout(getContext()); + TextView textView = new TextView(getContext()); + FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + layoutParams.gravity = Gravity.CENTER; + textView.setLayoutParams(layoutParams); + textView.setGravity(Gravity.CENTER); + textView.setText(hintText); + textView.setTextColor(Color.BLACK); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + frameLayout.addView(textView); + frameLayout.setBackgroundColor(Color.YELLOW); + return frameLayout; + } + + public void setHintText(String hintText) { + this.hintText = hintText; + } +} diff --git a/doric-android/doric/src/main/java/pub/doric/shader/ViewNode.java b/doric-android/doric/src/main/java/pub/doric/shader/ViewNode.java index 6ba3758c..b86fccde 100644 --- a/doric-android/doric/src/main/java/pub/doric/shader/ViewNode.java +++ b/doric-android/doric/src/main/java/pub/doric/shader/ViewNode.java @@ -609,9 +609,15 @@ public abstract class ViewNode extends DoricContextHolder { public static ViewNode create(DoricContext doricContext, String type) { DoricRegistry registry = doricContext.getDriver().getRegistry(); - DoricMetaInfo clz = registry.acquireViewNodeInfo(type); + DoricMetaInfo clz = registry.acquireViewNodeInfo(type); + if (clz == null) { + clz = new DoricMetaInfo<>(ErrorHintNode.class); + } ViewNode ret = clz.createInstance(doricContext); ret.mType = type; + if (ret instanceof ErrorHintNode) { + ((ErrorHintNode) ret).setHintText(type); + } return ret; } diff --git a/doric-android/doric/src/main/java/pub/doric/shader/flex/FlexNode.java b/doric-android/doric/src/main/java/pub/doric/shader/flex/FlexNode.java index 095f993a..fe643650 100644 --- a/doric-android/doric/src/main/java/pub/doric/shader/flex/FlexNode.java +++ b/doric-android/doric/src/main/java/pub/doric/shader/flex/FlexNode.java @@ -17,7 +17,6 @@ package pub.doric.shader.flex; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import com.facebook.yoga.YogaAlign; import com.facebook.yoga.YogaDirection; diff --git a/doric-iOS/Pod/Classes/Extension/DoricBridgeExtension.m b/doric-iOS/Pod/Classes/Extension/DoricBridgeExtension.m index 710ae3e7..99935b38 100644 --- a/doric-iOS/Pod/Classes/Extension/DoricBridgeExtension.m +++ b/doric-iOS/Pod/Classes/Extension/DoricBridgeExtension.m @@ -21,7 +21,6 @@ // #import "DoricBridgeExtension.h" -#import "DoricRegistry.h" #import "DoricContextManager.h" #import "DoricNativePlugin.h" #import "DoricUtil.h" @@ -38,6 +37,13 @@ - (id)callNativeWithContextId:(NSString *)contextId module:(NSString *)module me return nil; } Class pluginClass = [self.registry acquireNativePlugin:module]; + if (!pluginClass) { + [[[DoricPromise alloc] initWithContext:context callbackId:callbackId] + reject:[NSString stringWithFormat:@"Cannot obtain plugin instance:%@, method:%@", + module, + method]]; + return @(NO); + } DoricNativePlugin *nativePlugin = context.pluginInstanceMap[module]; if (nativePlugin == nil) { nativePlugin = [(DoricNativePlugin *) [pluginClass alloc] initWithContext:context]; @@ -96,6 +102,7 @@ - (id)findClass:(Class)clz target:(id)target context:(DoricContext *)context met } @catch (NSException *exception) { DoricLog(@"CallNative Error:%@", exception.reason); [strongContext.driver.registry onException:exception inContext:strongContext]; + [[[DoricPromise alloc] initWithContext:context callbackId:callbackId] reject:exception.reason]; } }; @@ -127,6 +134,11 @@ - (id)findClass:(Class)clz target:(id)target context:(DoricContext *)context met Class superclass = class_getSuperclass(clz); if (superclass && superclass != [NSObject class]) { return [self findClass:superclass target:target context:strongContext method:name callbackId:callbackId argument:argument]; + } else { + [[[DoricPromise alloc] initWithContext:context callbackId:callbackId] + reject:[NSString stringWithFormat:@"Cannot find plugin method in class:%@, method:%@", + NSStringFromClass(clz), + name]]; } } return ret; diff --git a/doric-iOS/Pod/Classes/Shader/DoricErrorHintNode.h b/doric-iOS/Pod/Classes/Shader/DoricErrorHintNode.h new file mode 100644 index 00000000..b595d5d1 --- /dev/null +++ b/doric-iOS/Pod/Classes/Shader/DoricErrorHintNode.h @@ -0,0 +1,32 @@ +/* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// +// DoricErrorHintNode.h +// DoricCore +// +// Created by pengfei.zhou on 2021/6/22. +// + +#import +#import "DoricViewNode.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface DoricErrorHintNode : DoricViewNode +@property(nonatomic, copy) NSString *hintText; +@end + +NS_ASSUME_NONNULL_END diff --git a/doric-iOS/Pod/Classes/Shader/DoricErrorHintNode.m b/doric-iOS/Pod/Classes/Shader/DoricErrorHintNode.m new file mode 100644 index 00000000..734c1016 --- /dev/null +++ b/doric-iOS/Pod/Classes/Shader/DoricErrorHintNode.m @@ -0,0 +1,35 @@ +/* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// +// DoricErrorHintNode.m +// DoricCore +// +// Created by pengfei.zhou on 2021/6/22. +// + +#import "DoricErrorHintNode.h" + +@implementation DoricErrorHintNode +- (UILabel *)build { + UILabel *view = [UILabel new]; + view.text = self.hintText; + view.textColor = [UIColor blackColor]; + view.font = [UIFont systemFontOfSize:16]; + view.textAlignment = NSTextAlignmentCenter; + view.backgroundColor = [UIColor yellowColor]; + return view; +} +@end diff --git a/doric-iOS/Pod/Classes/Shader/DoricViewNode.m b/doric-iOS/Pod/Classes/Shader/DoricViewNode.m index d371ee79..8fd1d563 100644 --- a/doric-iOS/Pod/Classes/Shader/DoricViewNode.m +++ b/doric-iOS/Pod/Classes/Shader/DoricViewNode.m @@ -29,6 +29,7 @@ #import "DoricExtensions.h" #import "DoricPromise.h" #import "DoricFlexNode.h" +#import "DoricErrorHintNode.h" @interface AnimationCallback : NSObject @property(nonatomic, strong) NSMutableDictionary *dictionary; @@ -322,7 +323,13 @@ - (DoricAsyncResult *)pureCallJSResponse:(NSString *)funcId, ... { + (__kindof DoricViewNode *)create:(DoricContext *)context withType:(NSString *)type { DoricRegistry *registry = context.driver.registry; Class clz = [registry acquireViewNode:type]; - DoricViewNode *viewNode = [(DoricViewNode *) [clz alloc] initWithContext:context]; + DoricViewNode *viewNode; + if (!clz) { + viewNode = [[DoricErrorHintNode alloc] initWithContext:context]; + ((DoricErrorHintNode *) viewNode).hintText = type; + } else { + viewNode = [(DoricViewNode *) [clz alloc] initWithContext:context]; + } viewNode.type = type; return viewNode; }