草庐IT

android - Flutter - 'enableInteractiveSelection' 不适用于 EditableText

coder 2023-07-22 原文

我正在尝试使用 Flutter 的“EditableText”类。 我有 3 个问题。

  1. “enableInteractiveSelection”设置为“true”,但我没有看到“剪切、复制、粘贴”。

  2. 'onSelectionChanged' 似乎不起作用。即使更改选择,我也看不到控制台中的任何内容。

  3. 有人可以向我解释如何使用“selectionControls”吗?

下面是我的“EditableText”代码

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Editable Text'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  TextEditingController _mainContentController;
  TextSelectionControls _mainContentSelectionController;
  FocusNode _textFieldFocusNode;

  @override
  void initState() {
    _textFieldFocusNode = FocusNode();
    _mainContentController = TextEditingController();
    super.initState();
  }

  @override
  void dispose() {
    _mainContentController.dispose();
    _textFieldFocusNode.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        children: <Widget>[
          Text('Editable Text Below'),
          Container(
            padding: EdgeInsets.all(10),
            child: EditableText(
              focusNode: _textFieldFocusNode,
              controller: _mainContentController,
              selectionColor: Colors.blue,
              style: TextStyle(color: Colors.black, fontSize: 17),
              cursorColor: Colors.blue,
              textInputAction: TextInputAction.newline,
              maxLines: null,
              onChanged: (text) {
                print(text);
              },
              enableInteractiveSelection: true,
              onSelectionChanged:
                  (TextSelection textSelection, SelectionChangedCause cause) {
                print('working?');
                print(textSelection.start);
                print(cause);
              },
              selectionControls: _mainContentSelectionController,
            ),
          )
        ],
      ),
    );
  }
}

最佳答案

您可以只使用 TextField,它具有针对 Android 和 iOS 的交互式 Controller 的自定义实现。

这是 Android 的实现:

    class _MaterialTextSelectionControls extends TextSelectionControls {
      @override
      Size handleSize = const Size(_kHandleSize, _kHandleSize);

      /// Builder for material-style copy/paste text selection toolbar.
      @override
      Widget buildToolbar(BuildContext context, Rect globalEditableRegion, Offset position, TextSelectionDelegate delegate) {
        assert(debugCheckHasMediaQuery(context));
        assert(debugCheckHasMaterialLocalizations(context));
        return ConstrainedBox(
          constraints: BoxConstraints.tight(globalEditableRegion.size),
          child: CustomSingleChildLayout(
            delegate: _TextSelectionToolbarLayout(
              MediaQuery.of(context).size,
              globalEditableRegion,
              position,
            ),
            child: _TextSelectionToolbar(
              handleCut: canCut(delegate) ? () => handleCut(delegate) : null,
              handleCopy: canCopy(delegate) ? () => handleCopy(delegate) : null,
              handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
              handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
            ),
          )
        );
      }

      /// Builder for material-style text selection handles.
      @override
      Widget buildHandle(BuildContext context, TextSelectionHandleType type, double textHeight) {
        final Widget handle = Padding(
          padding: const EdgeInsets.only(right: 26.0, bottom: 26.0),
          child: SizedBox(
            width: _kHandleSize,
            height: _kHandleSize,
            child: CustomPaint(
              painter: _TextSelectionHandlePainter(
                color: Theme.of(context).textSelectionHandleColor
              ),
            ),
          ),
        );

        // [handle] is a circle, with a rectangle in the top left quadrant of that
        // circle (an onion pointing to 10:30). We rotate [handle] to point
        // straight up or up-right depending on the handle type.
        switch (type) {
          case TextSelectionHandleType.left: // points up-right
            return Transform(
              transform: Matrix4.rotationZ(math.pi / 2.0),
              child: handle
            );
          case TextSelectionHandleType.right: // points up-left
            return handle;
          case TextSelectionHandleType.collapsed: // points up
            return Transform(
              transform: Matrix4.rotationZ(math.pi / 4.0),
              child: handle
            );
        }
        assert(type != null);
        return null;
      }
    }

可以从text_selection.dart查看源码,cupertino也一样。

在您的示例中,您使用的是空变量 _mainContentSelectionController,因此在长按输入时您看不到任何内容。

尝试从 TextSelectionControls 创建一个新类并从 _MaterialTextSelectionControls 复制逻辑。

示例:

      selectionControls: MySelectionControls(),

...

  class MySelectionControls extends TextSelectionControls {
    @override
    Widget buildHandle(BuildContext context, TextSelectionHandleType type, double textLineHeight) {
      // TODO: implement buildHandle
      return null;
    }

    @override
    Widget buildToolbar(BuildContext context, Rect globalEditableRegion, Offset position, TextSelectionDelegate delegate) {
      // TODO: implement buildToolbar
      return null;
    }

    @override
    // TODO: implement handleSize
    Size get handleSize => null;

  }

关于android - Flutter - 'enableInteractiveSelection' 不适用于 EditableText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53991915/

有关android - Flutter - 'enableInteractiveSelection' 不适用于 EditableText的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  5. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  6. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  7. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  8. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  9. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  10. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

随机推荐