我有一个Android应用程序,它同时使用React Native和JNI.C++(通过JUCE库的一个分支)用于生成其中一个视图.
React Native要求从重写的方法返回一个新的视图实例createViewInstance(context).每次更新包含此视图的React Native组件时,似乎都会调用此方法.
这是我的(简化)实现:
protected JuceViewHolder createViewInstance(ThemedReactContext themedReactContext) {
JuceBridge juceBridge = JuceBridge.getInstance();
juceViewHolder = new JuceViewHolder(themedReactContext);
// JNI method: this will trigger JuceBridge.createNewView
MainActivity.createJuceWindow(juceViewHolder);
return juceViewHolder;
Run Code Online (Sandbox Code Playgroud)
}
供参考,createJuceWindow定义为:
JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, createJuceWindow, jobject, (JNIEnv* env, jclass, jobject view))
{
JuceView::getInstance().createJuceWindow(view);
}
Run Code Online (Sandbox Code Playgroud)
哪个叫:
void createJuceWindow(jobject view)
{
viewToAttachTo = GlobalRef(view); // [GlobalRef][1] manages NewGlobalRef
myComponent = std::unique_ptr<MyComponent> (new MyComponent);
myComponent->setVisible (true);
myComponent->setOpaque(true);
if (viewToAttachTo.get() == nullptr)
DBG ("createJuceWindow: viewToAttachTo null!!!");
myComponent->setBounds(Desktop::getInstance().getDisplays().getMainDisplay().userArea);
myComponent->addToDesktop (0, viewToAttachTo.get()); // …Run Code Online (Sandbox Code Playgroud) 我有一个React Native子组件,如果disabledprop被设置为true ,它会将按钮呈现为半透明状态.app最初加载后(一旦获得数据)可能会更新,因此不会是组件的初始状态.
我可以看到,一旦我与按钮交互,它就会改变它的状态,但出于某种原因,之前没有.我可以从日志和onPress行为中看到道具正在更新.我尝试了不同的方法,但似乎没有解决问题.
class TestButton extends React.Component {
constructor(props) {
super(props);
}
render() {
const buttonOpacity = (this.props.disabled ? disabledOpacity : 1.0);
console.log ("test disabled", this.props.disabled, buttonOpacity);
return (
<BubbleText style={{opacity: buttonOpacity}} onPress={
() => ! this.props.disabled && doSomething() }>
{ this.props.testNumber }
</BubbleText>
);
}
}
Run Code Online (Sandbox Code Playgroud) 尝试在本机模块中调用方法时出现以下错误:
'undefined' is not an object (evaluating 'ScaleController. updateScaleFromJSON')
我的原生模块Objective-C文件 -
RCTScaleController.h:
#ifndef RCTScaleController_h
#define RCTScaleController_h
#import "RCTBridgeModule.h"
@interface RCTScaleController : NSObject <RCTBridgeModule>
@end
#endif /* RCTScaleController_h */
Run Code Online (Sandbox Code Playgroud)
RCTScaleController.mm:
#import "RCTScaleController.h"
#import "ScaleControllerObjC.h"
#import "RCTLog.h"
@implementation RCTScaleController
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(updateScaleFromJSON:(NSString *)jsonString)
{
RCTLogInfo(@"About to send json: %@", jsonString);
ScaleControllerObjC *scaleController = [[ScaleControllerObjC alloc] init];
[scaleController updateScaleFromJSON:jsonString];
}
Run Code Online (Sandbox Code Playgroud)
在我的JS文件中需要它:
var ScaleController = require('react-native').NativeModules.RCTScaleController;
Run Code Online (Sandbox Code Playgroud)
在这里它被调用导致错误:
ScaleController.updateScaleFromJSON (JSON.stringify (scale));
Run Code Online (Sandbox Code Playgroud)
我按照我见过的例子,不知道这里有什么问题.
我已经为react-native应用程序创建了一个自定义视图,该应用程序本身就是C ++ DSP应用程序,并在计时器上运行。该视图是使用其init方法在启动时初始化的。但是,为了节省CPU周期,我需要知道该视图何时可见。
如果我使用的是iOS UIViewController,则可以使用viewDidAppear或viewWillAppear将消息发送到C ++代码以启动计时器,并viewDidDisappear告诉其停止。
我正在寻找一种干净的方法来从RCTViewManager中执行相同的操作。
我有一个从 CMake 生成的 Xcode iOS 项目,由几个具有如下依赖关系树的目标组成:
A、B 和 C 生成静态库。D 是可执行应用程序目标。
在构建阶段一切看起来都是正确的。但是,当我构建目标 D 时,由于缺少 A、B 和 C 的静态库,我收到链接器错误。查看每个依赖项的构建产品路径,我可以看到它们尚未在预期位置创建。
我可以进入每个目标并在 Xcode 中构建它,之后我会看到“构建成功”消息,但遗憾的是,目标的“构建产品路径”中没有出现任何内容。
实现此目的的唯一方法是xcodebuild在每个目标的命令行上运行。这并不理想,因为这意味着我无法将代码库作为一个项目来工作 - 我必须手动构建修改后的目标才能在可执行文件中对其进行测试。奇怪的是我在 Xcode 中遇到了目标的构建错误,所以有些东西正在编译,但我不知道在哪里!
我使用的是 macOS 12.0.1 和 Xcode 13.2.1
请注意,直接通过 CLion 为 macOS 构建相同的 CMake 项目可以正常构建 - 问题似乎与生成的 Xcode 项目有关。
我正在建立一个新的Laravel项目并整合PHPSpec.我无法找到一个与Laravel整齐合作的phpspec.yml文件的良好工作示例.与Rails中的RSpec类似.
我想要的文件夹结构如下
spec/
models/
controllers/
app/
models/
controllers/
Run Code Online (Sandbox Code Playgroud)
我的phpspec.yml目前看起来像这样:
suites:
controller_suite:
namespace: Controller
spec_path: 'spec/controllers'
src_path: 'app/controllers'
model_suite:
namespace: Model
spec_path: 'spec/models'
src_path: 'app/models'
Run Code Online (Sandbox Code Playgroud)
我在spec/models文件夹中复制了我的模型相关测试,但是当我'phpspec运行'它没有运行它们中的任何一个.我也意识到命名空间不是Laravel中的'Model'和'Controller',也许更像是Eloquent和BaseController.
我也使用这个扩展名:https://github.com/BenConstable/phpspec-laravel
我不知道如何设置它,找不到任何有用的例子.提前致谢!
编辑:来自Jeffrey Way的另一个论坛上的建议:
您可以使用Behat测试您的控制器.PHPSpec不能代替它(或Codeception).
更新:
我已经决定使用Codeception,因为它似乎整齐地集成到Laravel并广泛使用.
我正在将React Native与现有的iOS应用程序集成.我已经按照指南集成了现有的应用程序.
在阅读了关于这个主题的其他一些帖子后,我尝试过:
还有什么我可能需要检查的吗?
我最近从 1.24 更新到了ReactNativeControllers 2.03。我还把 RN 更新到了 0.25。我使用的fork只添加了 Podspec 文件。在整理完 RN 中的所有导入更改后,我现在对这个错误感到困惑:
(另请参阅https://github.com/wix/react-native-controllers/issues/59)
RCCManager.setRootController 被调用时使用了 3 个参数,但期望有 2 个参数。如果您自己没有更改此方法,这通常意味着您的本机代码和 JavaScript 代码的版本不同步。更新两者应该可以消除此错误。
有问题的代码:
在RCCManagerModule.m:
setRootController:(NSDictionary*)layout animationType:(NSString*)animationType globalProps:(NSDictionary*)globalProps)
Run Code Online (Sandbox Code Playgroud)
并在index.js:
ControllerRegistry: {
registerController: function (appKey, getControllerFunc) {
_controllerRegistry[appKey] = getControllerFunc();
},
setRootController: function (appKey, animationType = 'none', passProps = {}) {
var controller = _controllerRegistry[appKey];
if (controller === undefined) return;
var layout = controller.render();
_validateDrawerProps(layout);
RCCManager.setRootController(layout, animationType, passProps);
}
},
Run Code Online (Sandbox Code Playgroud)
很明显,两者都有 3 个参数。
我已经杀死并重新启动了打包程序。我已经清理了 Xcode …
我调整了布局,以便导航抽屉出现在工具栏下方:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar android:id="@+id/detail_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.v7.widget.RecyclerView
android:id="@+id/left_drawer"
android:scrollbars="vertical"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="left|start"
android:choiceMode="singleChoice"
android:divider="@null"
android:background="@color/colorPrimary"
/>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:fitsSystemWindows="true"
tools:context=".JuceActivity" tools:ignore="MergeRootFrame">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/juce_view_container"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:orientation="horizontal" />
<android.support.design.widget.FloatingActionButton android:id="@+id/fab"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical|start" android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/stat_notify_chat"
app:layout_anchor="@+id/juce_view_container" app:layout_anchorGravity="top|end" />
</android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.DrawerLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
但是,现在抽屉的Recycler View不会滚动,也不会响应点击事件.
我在这里错过了什么?
我正在从我的 React Native 应用程序中删除装饰器(babel 的问题太多)并且我的操作不起作用(包含的函数没有运行)。
我正在翻译集体诉讼,例如
class MyStore {
//...
@action
myAction(param) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
到
class MyStore {
//...
myAction(param) {
action("Perform action with param", (param) => {
//...
})
}
}
Run Code Online (Sandbox Code Playgroud)
将类@action 转换为非装饰器形式的正确方法是什么?
我想使用Request :: server('HTTP_HOST')来获取当前域-但是,当我从一个帮助器类中调用它时,它返回为'localhost',这不是我想要的。从控制器可以正常工作。有没有办法从帮助程序类中访问此信息?
助手类如下所示:
class ApiWrapper {
public static function call($model, $method='', array $input) {
$domain = Request::server('HTTP_HOST');
}
}
Run Code Online (Sandbox Code Playgroud) react-native ×7
ios ×5
android ×2
cocoapods ×2
javascript ×2
mobx ×2
xcode ×2
c++ ×1
java ×1
jsx ×1
laravel ×1
laravel-4 ×1
mobx-react ×1
objective-c ×1
phpspec ×1
reactjs ×1
session ×1