@@ -295,13 +295,15 @@ 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+ })),
306+ );
305307 }
306308}
307309
@@ -333,53 +335,56 @@ class BlockContentList extends StatelessWidget {
333335
334336 @override
335337 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- ]);
338+ return Semantics (
339+ explicitChildNodes: true ,
340+ child: Column (crossAxisAlignment: CrossAxisAlignment .stretch, children: [
341+ ...nodes.map ((node) {
342+ return switch (node) {
343+ LineBreakNode () =>
344+ // This goes in a Column. So to get the effect of a newline,
345+ // just use an empty Text.
346+ const Text ('' ),
347+ ThematicBreakNode () => const ThematicBreak (),
348+ ParagraphNode () => Paragraph (node: node),
349+ HeadingNode () => Heading (node: node),
350+ QuotationNode () => Quotation (node: node),
351+ ListNode () => ListNodeWidget (node: node),
352+ SpoilerNode () => Spoiler (node: node),
353+ CodeBlockNode () => CodeBlock (node: node),
354+ MathBlockNode () => MathBlock (node: node),
355+ ImagePreviewNodeList () => MessageImagePreviewList (node: node),
356+ ImagePreviewNode () => (){
357+ assert (false ,
358+ "[ImagePreviewNode] not allowed in [BlockContentList]. "
359+ "It should be wrapped in [ImagePreviewNodeList]."
360+ );
361+ return MessageImagePreview (node: node);
362+ }(),
363+ InlineVideoNode () => MessageInlineVideo (node: node),
364+ EmbedVideoNode () => MessageEmbedVideo (node: node),
365+ TableNode () => MessageTable (node: node),
366+ TableRowNode () => () {
367+ assert (false ,
368+ "[TableRowNode] not allowed in [BlockContentList]. "
369+ "It should be wrapped in [TableNode]."
370+ );
371+ return const SizedBox .shrink ();
372+ }(),
373+ TableCellNode () => () {
374+ assert (false ,
375+ "[TableCellNode] not allowed in [BlockContentList]. "
376+ "It should be wrapped in [TableRowNode]."
377+ );
378+ return const SizedBox .shrink ();
379+ }(),
380+ WebsitePreviewNode () => WebsitePreview (node: node),
381+ UnimplementedBlockContentNode () =>
382+ Text .rich (_errorUnimplemented (node, context: context)),
383+ };
384+
385+ }),
386+ ]),
387+ );
383388 }
384389}
385390
0 commit comments