【问题标题】:react-native: Switch Component onValueChange doesnt get called in Androidreact-native:在Android中没有调用开关组件onValueChange
【发布时间】:2017-01-04 00:25:06
【问题描述】:

在 Android 应用程序中运行时,我一直在努力解决 React Native 中的开关组件中的一个奇怪问题。

可以说,我有一个组件,其渲染方法如下所示:

render() {
return (
  <View>
    <View>
      <Text>
        Test Title
      </Text>
      <Switch
        value={ this.state.value }
        onValueChange={
          this.test.bind( this )
        }
      />
    </View>
  </View>
);

}

test 方法是:

constructor(props){
  super(props);
  this.state = {
    value: true
  };
}


test(){
 this.setState( {value: !this.state.value})
}

当我在我的 iOS 应用程序中运行我的模块时,onValueChange 方法被调用并且一切都按预期工作,但是,当我在我的 Android 应用程序中执行相同操作时,当值更改为 false 时,该方法永远不会被调用。更重要的是,我不能多次更改该值,即我只能将值设置为 false,之后不允许我将其设置为 true。我可以再次使用开关元素的唯一方法是按住栏,但是,值永远不会改变(开关组件不会改变它的颜色)也不会改变调用的方法。

有没有人遇到过类似的情况?这是 RN 及其适用于 Android 的 Switch 组件的问题吗?

我正在使用:

  • 反应:15.4.1
  • 反应原生:0.39

***注意 1:当我将 RN 代码放入活动时会调用 onValueChange,但在片段内时会失败。

【问题讨论】:

  • Android Picker RN 组件存在类似问题

标签: android react-native


【解决方案1】:

试试这个。

constructor(props){
    super(props);
    this.state = {
      value: true
    };
 }

在你的渲染中

render() {
    return (
      <View>
        <Text>
          Test Title
        </Text>
        <Switch
          value={ this.state.value }
          onValueChange={(value) => this.setState({value})}
        />
      </View>
    );
  }

您可以删除您的 test() 函数

【讨论】:

  • 谢谢,我试过这个方法还是不行,实际上上面的代码是一个示例,我真正的渲染方法有:&lt;Switch value={ item.value } onValueChange={ ( value ) =&gt; { this.props.onChangeValue( this.props.index, { ...item, value } ) } } style = { this.props.style.switch_elem } /&gt;。 PS:我正在验证道具等,正如我所说,它适用于 iOS。这就是为什么我想知道这是 RN 上的一个特殊问题还是只是我遗漏了一些东西。
  • 它抛出未定义的值:(
  • @Danish 你能把你的完整错误和你的代码过去吗?
  • @SantoshSharma 我已经编写了我的解决方案,该解决方案对我有用。请检查。
【解决方案2】:

对我有用的是这个,

constructor(props) {
        super(props)
        this.state = {
            isOpen : false
        }
        this.onControlChange = this.onControlChange.bind(this); 
    }

onControlChange(value) {

    return this.setState({
        isOpen: !this.state.isOpen
    });
 }  

然后以这种方式使用

render() {
    return (
        <Switch 
            onValueChange={this.onControlChange} 
            value={this.state.isOpen}
        />
    )
}

所以我相信你应该在构造函数中为你的函数声明绑定。我只为 Android 模拟器测试了这个。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-01-05
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2021-09-13
    • 2018-02-27
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多