就拿公司的会议项目,由于直接使用的是第三方的demo改一改就上线的,近期遇到一个bug,其他开发人员产生的,到我手上是如何在5分钟之内迅速找到问题所在并且修复的
bug:flutter项目出现的bug是在切换中英文后我们自己写的菜单按钮会消失
这个很好找,如果有一定的观察力是可以直接定位到是哪个文件的,现在就从零开始找这个文件
出现问题的界面是进入会议室底部弹窗里面的菜单
首先从main.dart开始
runApp(MeetingAppLocalizationsScope(child: MeetingApp()));
MeetingApp这个类的关键代码在SplashPage
MaterialApp(
home: SplashPage(),
)
SplashPage里面就是一个开屏展示,然后跳转首页
NavUtils.pushNamedAndRemoveUntil(context, RouterName.homePage);
这就很快定位到首页了,首页里面有加入会议的逻辑,找到加入会议这块
navigatorState.push(MaterialPageRoute(
builder: (context) => MeetingUIRouter(
roomContext: roomContext,
arguments: meetingArguments,
),
));
MaterialPage(
name: _RouterName.inMeeting,
key: ValueKey((_RouterName.inMeeting, uiNavigator.roomContext)),
child: Builder(
builder: (context) => MeetingPage(uiNavigator.meetingArguments),
),
),
从这里跳转到会议中去的最终的界面是meetingpage这个类
这里基本上就是出问题的界面了,在开发工具右侧可以看到该类中所有的方法,这个时候最快速的方式就是通过右侧找到对应的方法名称,这个bug出现在菜单弹窗,找到方法名为
_showMorePopupMenu
关键逻辑在
final widgets = _fullMoreMenuItemList
.where((e) => shouldShowMenu(e, isMoreMenuItem: true))
.map((e) => menuItem2Widget(e, isMoreMenuItem: true))
.whereType<Widget>()
.toList(growable: false);
发现有一层where的过滤,bug的表现是菜单在切换语言后会丢失,那很大可能就是这个过滤导致丢失了,追到shouldShowMenu方法中去
if (!item.isValid) return false;
最可疑的是上面的判断,其他的判断基本和我们新添加的菜单无关,只有这里会影响到我们新增的菜单,item的类型是一个NEMeetingMenuItem,这个类有三个实现类,每个都实现了isValid属性,
@override
bool get isValid {
return isBuiltInMenuItem || (super.isValid && singleStateItem.isValid);
}
前面的条件判断是没问题的,最有可能出现问题的是最后一个singleStateItem.isValid追进去发现逻辑是下面这段逻辑
bool get isValid =>
textGetter != null ||
(text != null && text!.length > 0 && text!.length <= maxTextLength);
到这里就非常明了了,text百分百有值,基本可以确认是按钮文字长度的问题
这个maxTextLength变量是全局的
maxTextLength = 10;
所以最终定位的bug原因是按钮的文字不能超过10个字符,中文,日文的都在10个字符内所以表现正常,英文的长度超过了,所以最终到这个菜单被上面的shouldShowMenu方法过滤掉了
问题解决,以上只是一个排查问题的思路,从你熟悉的地方开始找,不断的往下找调用栈,不熟悉的地方只要能找到位置,其实逻辑有没有问题一眼就可以看出来