二次路由至Conductor Controller时悬浮按钮失效问题
首先看一下你提供的BaseController代码,核心问题大概率出在ButterKnife的生命周期管理或者悬浮按钮的初始化时机上,结合Conductor的Controller生命周期特性,我给你梳理几个排查和修复方向:
1. 完善BaseController的ButterKnife解绑逻辑
你的BaseController目前只做了绑定,但没有在Controller的视图销毁时正确解绑ButterKnife,这会导致二次路由时unbinder引用未重置,可能引发绑定失效或者内存泄漏。
修改你的BaseController,补充onDestroyView的解绑逻辑:
public abstract class ButterKnifeController extends Controller { protected Unbinder unbinder; protected ButterKnifeController() { } protected ButterKnifeController(Bundle args) { super(args); } protected abstract View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container); @NonNull @Override protected View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) { View view = inflateView(inflater, container); // 确保每次创建视图时都重新绑定 unbinder = ButterKnife.bind(this, view); // 新增一个回调方法,让子类在View绑定完成后做初始化 onViewInitialized(view); return view; } @Override protected void onDestroyView(@NonNull View view) { super.onDestroyView(view); if (unbinder != null) { unbinder.unbind(); // 重置unbinder,避免下次绑定出现异常 unbinder = null; } } // 子类重写这个方法,做View绑定后的初始化工作(比如悬浮按钮设置) protected void onViewInitialized(View view) {} }
2. 调整悬浮按钮的初始化时机
不要在onCreateView里直接处理悬浮按钮的逻辑,而是放到新增的onViewInitialized方法中。这样每次Controller创建视图并完成ButterKnife绑定后,都会重新初始化悬浮按钮的状态和点击事件:
比如你的子类Controller示例:
public class TargetController extends ButterKnifeController { @BindView(R.id.floating_action_button) FloatingActionButton fab; @Override protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) { // 注意这里第三个参数是false,Conductor会负责把视图添加到容器中 return inflater.inflate(R.layout.controller_target, container, false); } @Override protected void onViewInitialized(View view) { super.onViewInitialized(view); // 在这里设置悬浮按钮的点击事件和状态 fab.setOnClickListener(v -> { // 你的二次路由逻辑 getRouter().pushController(RouterTransaction.with(new AnotherController())); }); // 确保悬浮按钮可见(如果之前有隐藏的情况) fab.setVisibility(View.VISIBLE); } }
3. 检查Conductor路由的复用问题
如果你的二次路由是复用了已存在的Controller实例,还需要在onAttach方法中重新同步悬浮按钮的状态,因为Controller被重新附加到视图时,之前的事件绑定可能已经失效:
@Override protected void onAttach(@NonNull View view) { super.onAttach(view); // 重新设置悬浮按钮的状态(比如可见性、点击事件) if (fab != null) { fab.setOnClickListener(v -> { // 重复的点击逻辑,或者抽成单独的方法复用 getRouter().pushController(RouterTransaction.with(new AnotherController())); }); } }
4. 验证布局加载是否正确
确认inflateView方法中,LayoutInflater.inflate的第三个参数是false——如果设置为true,视图会被直接添加到container中,Conductor的生命周期管理会出现异常,间接导致悬浮按钮等控件无法正常工作。
按照上面的步骤调整后,二次路由时ButterKnife会正确重新绑定视图,悬浮按钮的初始化逻辑也会每次执行,应该就能解决失效的问题了。
内容的提问来源于stack exchange,提问作者froy001

