kotlin 如何在Android中使用多个回栈方法将数据传递到目标?

9udxz4iz  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(179)

在一个项目中,我使用多个返回堆栈功能与底部导航标签。一切都工作正常,第一次进入目的地-与深层链接,用户交互-标签点击或通过导航编程。我使用2.5.2版本。BottomNavigationView是设置与setupWithNavController()
假设我们在底部导航中有A,B,C返回栈(根片段/根目的地)。重现的步骤(在[?]中是底部导航btns):

1. Click [B] tab - [B] becomes visible.
    '''''''''''
    '         '
    '    B    '
    '         '
    '         '
    ''''''''''' 
    [A] [B] [C]
    2. Click [C] tab - [C] visible.
    '''''''''''
    '         '
    '    C    '
    '  (BNT)  '
    '         '
    '''''''''''
    [A] [B] [C]
    3. In [C] click (BNT) button, which moves [C]->[B] with additional information. [B] is visible, information is not passed.
    '''''''''''
    '         '
    '    B    '
    '         '
    '         '
    '''''''''''
    [A] [B] [C]

步骤3中的操作定义如下(我尝试将其作为全局和本地操作):

<action
    android:id="@+id/action_C_to_B"
    app:destination="@id/graph_B"
    app:restoreState="true"
    app:popUpTo="@id/destination_A"
    app:popUpToSaveState="true">

    <argument
        android:name="informationInt"
        app:nullable="false"
        app:argType="integer" />
</action>

什么不起作用?如果我们多次输入操作中传递的参数,则它在目标B中永远不可用。我需要InformationInt after(BTN)以某种方式传递到目标[B]。
我所知道的:
1.参数是“不可变的”。它们在输入目标后设置,并在每次重新输入时恢复。这是因为设置了app:restoreState="true"标志-这是可以的-我希望多个回栈功能记住其回栈状态。
1.无法再设定参数一次,因为:

/**
     * Supply the construction arguments for this fragment.
     * The arguments supplied here will be retained across fragment destroy and
     * creation.
     * <p>This method cannot be called if the fragment is added to a FragmentManager and
     * if {@link #isStateSaved()} would return true.</p>
     */
    public void setArguments(@Nullable Bundle args) {
        if (mFragmentManager != null && isStateSaved()) {
            throw new IllegalStateException("Fragment already added and state has been saved");
        }
        mArguments = args;
    }

1.使用OnDestinationChangeListener没有帮助。它总是返回我们第一次输入目标时使用的参数。
我在寻找什么?我想把信息传递到目的地,同时在多个回栈结构中重新进入它。每个回栈必须记住它的状态。

jdg4fx2g

jdg4fx2g1#

我的理解是,当你回去的时候,你想带走一些信息,我会相应地给予我的答案。假设我们有一个片段b和c,当我们点击返回c时,我们将把数据传递给b
为此,我们用c语言编写

navController.currentBackStackEntry?.savedStateHandle?.set(
                        "data-key",
                        data
                    )

我们得到B片段中的数据

navController.currentBackStackEntry?.savedStateHandle?.getLiveData<String>("data-key")
        ?.observeOnce(
            viewLifecycleOwner
        ) { result ->
             //Write code here
            }
        }

相关问题