6

我正在使用 RN v0.46.4、react-navigation 和 sendbird。

我正在开发一个聊天应用程序。

我想要做的是使用两个参数item(包含用户信息)和createdChannel.

它们被传递但只有一次,即每次我导航到Msg不同用户的屏幕时,我都会收到与我首先按下的相同的值。

聊天画面

_chat(item){

 // console.log(item);
 const { navigate } = this.props.navigation

  var userIds = [item.id,1];
  sb = new SendBird({appId: APP_ID});
  sb.connect(1, function(user, error) {
         //console.log(user);
      sb.GroupChannel.createChannelWithUserIds(userIds, true, item.firstname, function(createdChannel, error) {
    if (error) {
        console.error(error);
        return;
    }

   //console.log(createdChannel);
   navigate('Msg', { item, createdChannel })

});

此外,当我在 中进行控制台createdChannel_chat function,它会按预期提供正确的信息。

但是当我在Msgscreen 中对其进行控制台时,我只收到了第一个 createdChannel 创建的,上面已经说过。

消息屏幕

 super(props);
  console.log(props.navigation.state.routes[1].params.createdChannel);

我的路由器结构:

const CustomTabRouter = TabRouter(
  {

    Chat: {
      screen: ChatStack, 
      path: ""
    }
}

聊天堆栈

const ChatStack= StackNavigator({
      Chat:{screen: Chats,
      navigationOptions: {
       header: null,
     }},

      Msg: {
      screen: Msg,
      navigationOptions: ({ navigation}) => ({
       title: `${navigation.state.params.item.firstname} ${navigation.state.params.item.lastname}`,
        tabBarVisible: false

      })
    },
    }) 
4

2 回答 2

1

我发现自己处于类似的境地。在我的情况下,问题是因为将参数传递给嵌套屏幕是故意从库中删除的(1.0.0-beta21 到 1.0.0-beta22)。

注意:但截至目前,react-navigation 版本为 v1.5.2

https://github.com/react-navigation/react-navigation/issues/3252

无论如何,我快速而肮脏的解决方案是使用screenProps将道具注入屏幕。

const ChatStack= StackNavigator({
  Chat:{ screen: Chats, ... },
  Msg: { screen: Msg, ... },
});

// Instead of exporting ChatStack directly, create a wrapper and pass navigation.state.params to screenProps

export default (props) => {
  const params = props.navigation.state.params;
  // const params = _.get(props, 'navigation.state.params');
  return (
    <ChatStack screenProps={params} />
  );
};

现在 ChatStack 下的所有屏幕都可以访问这些注入的道具。

于 2018-03-24T16:06:44.003 回答
1

在您的 Msg 屏幕的构造函数中,尝试通过调用来访问itemand 。createdChannelprops.navigation.state.params.createdChannel

super(props);
console.log(props.navigation.state.params.createdChannel);
console.log(props.navigation.state.params.item);
于 2017-07-23T15:16:49.220 回答