Попытка синглтона для React-Native - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь узнать, как создать одноэлементный экземпляр, который будет содержать значение, которое затем будет использоваться в состоянии определенного компонента.Например, скажем, я хочу создать компонент AudioControl, который содержит воспроизведение / паузу, которая изменит состояние, если приложение воспроизводит музыку или нет.Теперь также скажите, что мы используем несколько экранов, в которые мы встраиваем компонент.Хотя каждый экран будет содержать свой собственный экземпляр AudioControl, я бы хотел, чтобы state.playing для этого компонента происходил из одноэлементного класса, в котором хранится это значение.

У меня что-то работает, но только на полпути.Это работает, если я запускаю приложение (нажмите кнопку воспроизведения, а затем перейдите к следующему экрану, чтобы увидеть, изменился ли этот компонент AudioControl. Однако, если я запускаю приложение, а затем переключаю вкладки перед нажатием кнопки воспроизведения, а затем нажимаю кнопку «Воспроизвести» на другом экране.Это не меняет состояние другого аудио компонента.

Вот то, что я имею до сих пор. Я также изучал внедрение зависимостей, но я новичок во всем этом и хотел бы знать обаметоды.

Мой код (App.js):

import React, { Component } from "react";
import { View, Text, Button} from "react-native";
import { createBottomTabNavigator, createAppContainer } from "react-navigation";

class AudioManager {

  static _instance;

  playing = false;

  static getInstance = () => {
    if (AudioManager._instance == null) {
      AudioManager._instance = new AudioManager()
    }
    return this._instance;
  }

}

let commonAudioManager = AudioManager.getInstance()


class AudioControls extends Component {

  constructor(props) {
    super(props)
    this.state = {
      playing: commonAudioManager.playing
    }
  }

  play = () => {
    commonAudioManager.playing = true
    this.setState({
      playing: commonAudioManager.playing
    })
  }

  pause = () => {
    commonAudioManager.playing = false
    this.setState({
      playing: commonAudioManager.playing
    })
  }

  render() {
    return (
      <View>
        <Text>Playing: {this.state.playing ? "Yes" : "No"}</Text> 
        { this.state.playing ? <Button title="Pause" onPress={this.pause} /> : <Button title="Play" onPress={this.play} /> }
      </View>
    )
  }
}

class HomeScreen extends Component {
  static navigationOptions = {
    title: "Home"
  }
  render() {
    return (
      <View style={{ flex: 1, alignItems: "center", justifyContent: "center"}}>
        <AudioControls />
      </View>
    )
  }
}

class AudioScreen extends Component {
  static navigationOptions = {
    title: "Audio"
  }

  render() {
    return (
      <View style={{ flex: 1, alignItems: "center", justifyContent: "center"}}>
        <AudioControls />
      </View>
    )
  }
}

const navigatorStack = createBottomTabNavigator({
  Home: HomeScreen,
  Audio: AudioScreen
})

export default createAppContainer(navigatorStack)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...