@@ -295,13 +295,14 @@ class MessageContent extends StatelessWidget {
295295 @override
296296 Widget build (BuildContext context) {
297297 final content = this .content;
298- return InheritedMessage (message: message,
299- child: DefaultTextStyle (
300- style: ContentTheme .of (context).textStylePlainParagraph,
301- child: switch (content) {
302- ZulipContent () => BlockContentList (nodes: content.nodes),
303- PollContent () => PollWidget (messageId: message.id, poll: content.poll),
304- }));
298+ return MergeSemantics (
299+ child: InheritedMessage (message: message,
300+ child: DefaultTextStyle (
301+ style: ContentTheme .of (context).textStylePlainParagraph,
302+ child: switch (content) {
303+ ZulipContent () => BlockContentList (nodes: content.nodes),
304+ PollContent () => PollWidget (messageId: message.id, poll: content.poll),
305+ })));
305306 }
306307}
307308
@@ -333,53 +334,56 @@ class BlockContentList extends StatelessWidget {
333334
334335 @override
335336 Widget build (BuildContext context) {
336- return Column (crossAxisAlignment: CrossAxisAlignment .stretch, children: [
337- ...nodes.map ((node) {
338- return switch (node) {
339- LineBreakNode () =>
340- // This goes in a Column. So to get the effect of a newline,
341- // just use an empty Text.
342- const Text ('' ),
343- ThematicBreakNode () => const ThematicBreak (),
344- ParagraphNode () => Paragraph (node: node),
345- HeadingNode () => Heading (node: node),
346- QuotationNode () => Quotation (node: node),
347- ListNode () => ListNodeWidget (node: node),
348- SpoilerNode () => Spoiler (node: node),
349- CodeBlockNode () => CodeBlock (node: node),
350- MathBlockNode () => MathBlock (node: node),
351- ImagePreviewNodeList () => MessageImagePreviewList (node: node),
352- ImagePreviewNode () => (){
353- assert (false ,
354- "[ImagePreviewNode] not allowed in [BlockContentList]. "
355- "It should be wrapped in [ImagePreviewNodeList]."
356- );
357- return MessageImagePreview (node: node);
358- }(),
359- InlineVideoNode () => MessageInlineVideo (node: node),
360- EmbedVideoNode () => MessageEmbedVideo (node: node),
361- TableNode () => MessageTable (node: node),
362- TableRowNode () => () {
363- assert (false ,
364- "[TableRowNode] not allowed in [BlockContentList]. "
365- "It should be wrapped in [TableNode]."
366- );
367- return const SizedBox .shrink ();
368- }(),
369- TableCellNode () => () {
370- assert (false ,
371- "[TableCellNode] not allowed in [BlockContentList]. "
372- "It should be wrapped in [TableRowNode]."
373- );
374- return const SizedBox .shrink ();
375- }(),
376- WebsitePreviewNode () => WebsitePreview (node: node),
377- UnimplementedBlockContentNode () =>
378- Text .rich (_errorUnimplemented (node, context: context)),
379- };
380-
381- }),
382- ]);
337+ return Semantics (
338+ explicitChildNodes: true ,
339+ child: Column (crossAxisAlignment: CrossAxisAlignment .stretch, children: [
340+ ...nodes.map ((node) {
341+ return switch (node) {
342+ LineBreakNode () =>
343+ // This goes in a Column. So to get the effect of a newline,
344+ // just use an empty Text.
345+ const Text ('' ),
346+ ThematicBreakNode () => const ThematicBreak (),
347+ ParagraphNode () => Paragraph (node: node),
348+ HeadingNode () => Heading (node: node),
349+ QuotationNode () => Quotation (node: node),
350+ ListNode () => ListNodeWidget (node: node),
351+ SpoilerNode () => Spoiler (node: node),
352+ CodeBlockNode () => CodeBlock (node: node),
353+ MathBlockNode () => MathBlock (node: node),
354+ ImagePreviewNodeList () => MessageImagePreviewList (node: node),
355+ ImagePreviewNode () => (){
356+ assert (false ,
357+ "[ImagePreviewNode] not allowed in [BlockContentList]. "
358+ "It should be wrapped in [ImagePreviewNodeList]."
359+ );
360+ return MessageImagePreview (node: node);
361+ }(),
362+ InlineVideoNode () => MessageInlineVideo (node: node),
363+ EmbedVideoNode () => MessageEmbedVideo (node: node),
364+ TableNode () => MessageTable (node: node),
365+ TableRowNode () => () {
366+ assert (false ,
367+ "[TableRowNode] not allowed in [BlockContentList]. "
368+ "It should be wrapped in [TableNode]."
369+ );
370+ return const SizedBox .shrink ();
371+ }(),
372+ TableCellNode () => () {
373+ assert (false ,
374+ "[TableCellNode] not allowed in [BlockContentList]. "
375+ "It should be wrapped in [TableRowNode]."
376+ );
377+ return const SizedBox .shrink ();
378+ }(),
379+ WebsitePreviewNode () => WebsitePreview (node: node),
380+ UnimplementedBlockContentNode () =>
381+ Text .rich (_errorUnimplemented (node, context: context)),
382+ };
383+
384+ }),
385+ ]),
386+ );
383387 }
384388}
385389
0 commit comments