SelectionArea仅对部分子组件生效,RichText无法选中的问题求助
SelectionArea仅对部分子组件生效,RichText无法选中的问题求助
大家好,我最近在给Flutter桌面应用开发文本选中功能时遇到了个棘手的问题,想过来请教下各位大佬。
我按照SelectableRegion的官方文档,把桌面应用的主路由用SelectionArea包裹了起来,核心代码如下:
class DesktopMainScreen extends StatelessWidget { const DesktopMainScreen({super.key}); @override Widget build(BuildContext context) { var navRailItem = context.select<AppStateBloc, NavRailItem>( (bloc) => bloc.state.navRailItem); return FocusableActionDetector( autofocus: true, child: Scaffold( body: listeners( Row( children: <Widget>[ NavigationRail( selectedIndex: NavRailItem.values.indexOf(navRailItem), destinations: NavRailItem.values.map((e) { return NavigationRailDestination( icon: Icon(e.iconData), label: Text(e.label), ); }).toList(), onDestinationSelected: (index) => context .read<AppStateBloc>() .add(NavRailChange(NavRailItem.values[index])), ), const VerticalDivider(), Expanded( child: SelectionArea( child: switch (navRailItem) { NavRailItem.recipes => DesktopRecipeView(), NavRailItem.shopping => ShoppingListWidget(), NavRailItem.settings => SettingsWidget(), }, ), ), ], ), ), ), ); } }
这么设置后,右键菜单确实出现了「Select All」选项,但只有部分子组件的文本能被选中:左侧列表的条目、部分标题可以正常选中,但大部分正文文本完全没法被选中。
我甚至尝试单独把那些无法选中的控件也用SelectionArea包裹起来,比如处理富文本的这段代码:
Iterable<Widget> formatWidget(RecipeStyles styler, RecipeFormat format) sync* { var children = formatSpan(styler, format, null, includeReturn: false).toList(); if (children.isEmpty) return; yield SelectionArea(child: RichText(text: TextSpan(children: children))); }
但结果还是没变化,依然是部分内容可选中,大部分不行。我完全搞不懂不同区域之间到底有什么差异,官方文档里也没提怎么调试这类问题,实在卡壳了...
后来我特意做了个最小复现的Demo,代码如下:
class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( builder: (context, child) => child!, home: Scaffold( body: SelectionArea( // child: Text('This works'), child: RichText( text: const TextSpan(text: 'Hello', style: TextStyle(color: Colors.black)), selectionRegistrar: SelectionContainer.maybeOf(context), selectionColor: const Color(0xAF6694e8), ), ), ), ); } }
在这个Demo里,RichText组件完全无法被选中,但如果把注释打开换成普通的Text组件就正常工作——这段代码我几乎是照着RichText的官方文档抄的,实在想不通哪里出了问题。
有没有大佬能帮我分析下这到底是怎么回事呀?
内容来源于stack exchange
相关产品推荐
相关产品推荐

