flutterdartselecttextshare

How share selected text in flutter


I work on reading book app in flutter, i make the text selectable text, but the problem when i want share the selected text, thier is any way to do it ?

I try use onselectionchanged in selectable to capture the selected text but this not work


Solution

  • onselectionchanged should work for you, although it is executed every time the user changes the selection, which I don't think is what you want, the normal thing is to add a button to the context menu with the one you want to share in your case.

    use contextMenuBuilder, note: this example use url_launcher for send sms with the text, you need run

    flutter pub add url_launcher

    example:

    import 'package:flutter/material.dart';
    import 'package:url_launcher/url_launcher.dart';
    
    void main() => runApp(const MyApp());
    
    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Material App',
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Material App Bar'),
            ),
            body: Center(
              child: SelectableText(
                contextMenuBuilder: (context, editableTextState) {
                  final TextEditingValue value = editableTextState.textEditingValue;
    
                  // Get text selected
                  final textSeleted = value.selection.textInside(value.text);
    
                  // Get button default of text selection
                  final List<ContextMenuButtonItem> buttonItems =
                      editableTextState.contextMenuButtonItems;
    
                  // Add new button share
                  buttonItems.insert(
                      0,
                      ContextMenuButtonItem(
                        label: 'share',
                        onPressed: () {
                          final Uri smsLaunchUri = Uri(
                            scheme: 'sms',
                            path: '011122355',
                            queryParameters: <String, String>{
                              'body': textSeleted,
                            },
                          );
    
                          // Launch sms with text selected
                          launchUrl(smsLaunchUri);
    
                          // Close context menu
                          ContextMenuController.removeAny();
                        },
                      ));
    
                  return AdaptiveTextSelectionToolbar.buttonItems(
                    anchors: editableTextState.contextMenuAnchors,
                    buttonItems: buttonItems,
                  );
                },
                'Hello World text bla bla 123',
              ),
            ),
          ),
        );
      }
    }
    

    enter image description here