羣花某天說,你咋不作下文本選擇的需求呢,剛需呢。是嗎? 我咋都沒看到有人提過呢?git
前面作了extended_text_field,裏面有光標和文本選擇的處理,原本想直接把改改,把光標去掉,而後不讓修改。可是想了下,怎麼能這麼隨便呢,仍是拿起了extended_text魔改起來。github
參數 | 描述 | 默認 |
---|---|---|
selectionEnabled | 是否開啓文本選擇功能 | false |
selectionColor | 文本選擇的顏色 | Theme.of(context).textSelectionColor |
dragStartBehavior | 文本選擇的拖拽行爲 | DragStartBehavior.start |
textSelectionControls | 文本選擇控制器,你能夠經過重寫,來定義工具欄和選擇器 | extendedMaterialTextSelectionControls/extendedCupertinoTextSelectionControls |
extended_text提供了默認的控制器extendedMaterialTextSelectionControls/extendedCupertinoTextSelectionControlsmarkdown
你能夠經過重寫,來定義工具欄和選擇器less
下面是一個自定義的工具欄ide
class MyExtendedMaterialTextSelectionControls extends ExtendedMaterialTextSelectionControls {
@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: ExtendedTextSelectionToolbarLayout(
MediaQuery.of(context).size,
globalEditableRegion,
position,
),
child: _TextSelectionToolbar(
handleCopy: canCopy(delegate) ? () => handleCopy(delegate) : null,
handleSelectAll:
canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
handleLike: () {
//mailto:<email address>?subject=<subject>&body=<body>, e.g.
launch(
"mailto:zmtzawqlp@live.com?subject=extended_text_share&body=${delegate.textEditingValue.text}");
delegate.hideToolbar();
},
),
),
);
}
}
/// Manages a copy/paste text selection toolbar.
class _TextSelectionToolbar extends StatelessWidget {
const _TextSelectionToolbar(
{Key key, this.handleCopy, this.handleSelectAll, this.handleLike})
: super(key: key);
final VoidCallback handleCopy;
final VoidCallback handleSelectAll;
final VoidCallback handleLike;
@override
Widget build(BuildContext context) {
final List<Widget> items = <Widget>[];
final MaterialLocalizations localizations =
MaterialLocalizations.of(context);
if (handleCopy != null)
items.add(FlatButton(
child: Text(localizations.copyButtonLabel), onPressed: handleCopy));
if (handleSelectAll != null)
items.add(FlatButton(
child: Text(localizations.selectAllButtonLabel),
onPressed: handleSelectAll));
if (handleLike != null)
items.add(FlatButton(child: Icon(Icons.favorite), onPressed: handleLike));
return Material(
elevation: 1.0,
child: Container(
height: 44.0,
child: Row(mainAxisSize: MainAxisSize.min, children: items),
),
);
}
}
複製代碼
你能夠經過將你的頁面包裹到ExtendedTextSelectionPointerHandler裏面來定義不一樣的行爲效果。svg
經過賦值ExtendedTextSelectionPointerHandler的child爲你的頁面,將會有默認的行爲工具
return ExtendedTextSelectionPointerHandler(
//default behavior
child: result,
);
複製代碼
你能夠經過builder方法獲取到頁面上面的所有的selectionStates(ExtendedTextSelectionState),而且經過本身獲取點擊事件來處理工具欄和選擇器post
return ExtendedTextSelectionPointerHandler(
//default behavior
// child: result,
//custom your behavior
builder: (states) {
return Listener(
child: result,
behavior: HitTestBehavior.translucent,
onPointerDown: (value) {
for (var state in states) {
if (!state.containsPosition(value.position)) {
//clear other selection
state.clearSelection();
}
}
},
onPointerMove: (value) {
//clear other selection
for (var state in states) {
state.clearSelection();
}
},
);
},
);
複製代碼
最近從新整理了一下readme,而且提供了中文文檔,由於你們總是吐槽不容易看,但願新的readme能幫助你們更好地使用這個組件。ui
最後放上 extended_text,若是你有什麼不明白或者對這個方案有什麼改進的地方,請告訴我,歡迎加入Flutter Candies,一塊兒生產可愛的Flutter 小糖果(QQ羣:181398081)this
最最後放上Flutter Candies全家桶,真香。