网站建设资讯

NEWS

网站建设资讯

php筛选数组中的数据库,php数组查询

Flutter TextField 长按出现的 ”复制/粘贴“文字改为中文

文字默认是英文,需要设置 Flutter 国际化来处理

10余年的绍兴网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整绍兴建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“绍兴网站设计”,“绍兴网站推广”以来,每个客户项目都认真落实执行。

在 pubspec.yaml 中集成 flutter_localizations

然后在 main.dart --- MaterialApp 中设置本地化代理和支持的语言类型

我最开始的时候没加,在iOS上长按会报错,需要加上这一行

如果 pubspec.yaml 集成插件因为版本问题报错,自己又不知道使用哪个版本,可以使用any集成,它会自己寻找合适的版本

扑 的单词怎么写 英文单词

有很多种说法:attack flap pounce on rush at snap throw oneself on

词典释义

动词

1.(使身体迅速地伏在物体上) throw oneself on; pounce on

2.(把全部精力用到工作、 事业等上面) dedicate all one's energies to a cause; devote

3.(扑打; 进攻) rush at; attack

4.(拍打;拍) flap; flutter

5.[方] (伏) bend over

名词

1.(扑粉用具) puff

以后查词,建议你用这个电子词典:

Flutter 上字体的另类玩法:FontFeature

在以前的 《Flutter 上默认的文本和字体知识点》 和 《带你深入理解 Flutter 中的字体“冷”知识》 中,已经介绍了很多 Flutter 上关于字体有趣的知识点,而本篇讲继续介绍 Flutter 上关于 Text 的一个属性: FontFeature , 事实上相较于 Flutter ,本篇内容可能和前端或者设计关系更密切 。

什么是 FontFeature ? 简单来说就是影响字体形状的一个属性 ,在前端的对应领域里应该是 font-feature-settings ,它有别于 FontFamily ,是用于指定字体内字的形状的一个参数。

我们知道 Flutter 默认在 Android 上使用的是 Roboto 字体,而在 iOS 上使用的是 SF 字体,但是其实 Roboto 字体也是分很多类型的,比如你去查阅手机的 system/fonts 目录,就会发现很多带有 Roboto 字样的字体库存在。

所以 Roboto 之类的字体库是一个很大的字体集,不同的 font-weight 其实对应着不同的 ttf ,例如默认情况下的 Roboto 是不支持 font-weight 为 600 的配置 :

所以如下图所示,如果我们设置了 w400 - w700 的 weight ,可以很明显看到中间的 500 和 600 其实是一样的粗细,所以在 设置 weight 或者设计 UI 时,就需要考虑不同平台上的 weight 是否支持想要的效果 。

回归到 FontFeature 上,那 Roboto 自己默认支持多少种 features 呢? 答案是 26 种,它们的编码如下所示,运行后效果也如下图所示,从日常使用上看,这 26 种 Feature 基本满足开发的大部分需求。

而 iOS 上的 SF pro 默认支持 39 种 Features , 它们的编码如下所示,运行后效果也如下图所示,可以看到 SF pro 支持的 Features 更多。

所以可以看到,并不是所有字体支持的 Features 都是一样的,比如 iOS 上支持 sups 上标显示和 subs 下标显示,但是 Android 上的 Roboto 并不支持,甚至很多第三方字体其实并不支持 Features 。

有趣的是,在 Flutter Web 有一个渲染文本时会变模糊的问题 #58159 ,这个问题目前官方还没有修复,但是你可以通过给 Text 设置任意 FontFeatures 来解决这个问题。

最后,如果对 FontFeature 还感兴趣的朋友,可以通过一下资料深入了解,如果你还有什么关于字体上的问题,欢迎留言讨论。

基于网友的问题再补充一下拓展知识,毕竟这方面内容也不多 。

事实上在 dart 里就可以看到对应 FontWeight 约定俗称用的是字体集里的什么字体:

所以如果对于默认字体有疑问,可以在你的手机字体找找是否有对应的字体, 比如虽然我们说 roboto 没有 600 ,但是如果是 roboto mono 字体集是有 600 的 fontweight ,甚至还有 600 斜体: 。

另外注意这是 Flutter 而不是原生,具体实现调用是在 Engine 的 paragraph_skia.cc 和 paragraph_builder_skia.cc 下对应的 setFontFamilies 相关逻辑,当然默认字体库指定在 typography.dart 下就看到,例如 'Roboto' 、 '.SF UI Display' 、 '.SF UI Text' 、 '.AppleSystemUIFont' 、 'Segoe UI' :

另外如果你在 Mac 的 Web 上使用 Flutter Web,可以看到指定的是 .AppleSystemUIFont ,而对于 .AppleSystemUIFont 它其实不算是一种字体,而是苹果上字体的一种集合别称:

[图片上传失败...(image-40f5ce-1648368234737)]

还有,如果你去看 Flutter 默认自带的 cupertino/context_menu_action.dart ,就可以看到一个有趣的情况:

当然,前面我们说了那么多,主要是针对英文的情况下,而在中文下还是有差异的 ,之前的文章也介绍过:

例如,在苹果上的简体中文其实会是 PingFang SC 字体,对应还有 PingFang TC 和 PingFang HK 的繁体集,而关于这个问题在 Flutter 上之前还出现过比较有意思的 bug :

当然后续的 #16709 修复了这个问题 ,而在以前的文章我也讲过,当时我遇到了 “Flutter 在 iOS 系统上,系统语言是韩文时,在和中文一起出现会导致字体显示异常" 的问题 :

解决方法也很简单,就是给 fontFamilyFallback 配置上 ["PingFang SC" , "Heiti SC"] 就可以了,这是因为韩文在苹果手机上使用的应该是 Apple SD Gothic Neo 这样的超集字体库,【广】这个字符在这个字体集上是不存在的,所以就变成了中文的【广】;

所以可以看到,字体相关是一个平时很少会深入接触的东西,但是一旦涉及多语言和绘制,就很容易碰到问题的领域 。

Flutter WebView安卓端输入框不能长按粘贴

Flutter项目中遇到在安卓端,输入框不能长按粘贴,其它像iOS端、浏览器功能都是正常的。查询各种资料,部分说是官方为了避免手势冲突禁用了长按粘贴功能。各种查资料、各种尝试都开启不了这一功能,而项目紧急那只能曲线救国了。

第一个方案:

因为h5复制文本内容到剪贴板这块是没问题的,那么h5是否可以直接获取剪贴板中的内容直接填写到输入框中,然而...,居然获取不到,说啥子只有在IE浏览器中才管用。

第二个方案(最终方案):

h5获取不到,但原生端不是可以的吗。最终流程,h5端输入框开始编辑,去调用原生端方法,告知需要获取剪贴板内容,原生端获取剪贴板内容调用h5端方法同时传值给h5端,最后输入框中不就有值了吗。

Flutter TextField 文本输入框的基本属性及详解

源码分析:

分析源码可得,TextField 是有状态 StatefulWidget,有丰富的属性,自定义化较高,实践中需要合理利用各种回调;

1、光标的相关属性;cursorColor 为光标颜色,cursorWidth 为光标宽度,cursorRadius 为光标圆角;其中 Radius 提供了 circle 圆角和 elliptical 非圆角两种;

2、textAlign 为文字起始位置,可根据业务光标居左/居右/居中等;注意只是文字开始方向;textDirection 问文字内容方向,从左向右或从右向左;

3、maxLength 为字符长度,设置时默认是展示一行,且右下角有编辑长度与整体长度对比;与 maxLengthEnforced 配合,maxLengthEnforced 为 true 时达到最大字符长度后不可编辑;为 false 时可继续编辑展示有差别;

4、设置 maxLength 之后右下角默认有字符计数器,设置 TextField.noMaxLength 即可只展示输入字符数;

5、maxLines 为允许展现的最大行数,在使用 maxLength 时内容超过一行不会自动换行,因为默认 maxLines=1,此时设置为 null 或固定展示行数即可自动换行;区别在于 null 会展示多行,而 maxLines 最多只展示到设置行数;

6、obscureText 是否隐藏编辑内容,常见的密码格式;

7、enableInteractiveSelection 长按是否出现【剪切/复制/粘贴】菜单;不可为空;

8、keyboardAppearance 为键盘亮度,包括 Brightness.dark/light 两种,但仅限于 iOS 设备;

9、textCapitalization 文字大小写;理论上 sentences 为每句话第一个字母大写;characters为每个字母大写;words 为每个单词首字母大写;但该属性仅限于 text keybord,和尚在本地更换多种方式并未实现,有待研究;

10、keyboardType 为键盘类型,和尚理解整体分为数字键盘和字母键盘等;根据设置的键盘类型,键盘会有差别;

a. 数字键盘

--1-- datetime 键盘上可随时访问 : 和 /;

--2-- phone 键盘上可随时访问 # 和 *;

--3-- number 键盘上可随时访问 + - * /

b. 字母键盘

--1-- emailAddress 键盘上可随时访问 @ 和 .;

--2-- url 键盘上可随时访问 / 和 .;

--3-- multiline 适用于多行文本换行;

--4-- text 默认字母键盘;

11、textInputAction 通常为键盘右下角操作类型,类型众多,建议多多尝试;

12、autofocus 是否自动获取焦点,进入页面优先获取焦点,并弹出键盘,若页面中有多个 TextField 设置 autofocus 为 true 则优先获取第一个焦点;

13、focusNode 手动获取焦点,可配合键盘输入等减少用户操作次数,直接获取下一个 TextField 焦点;

14、enabled 设为 false 之后 TextField 为不可编辑状态;

15、decoration 为边框修饰,可以借此来调整 TextField 展示效果;可以设置前置图标,后置图片,边框属性,内容属性等,会在后续集中尝试;若要完全删除装饰,将 decoration 设置为空即可;

16、inputFormatters 为格式验证,例如原生 Android 中通常会限制输入手机号或其他特殊字符,在 Flutter 中也可以借此来进行格式限制,包括正则表达式;使用时需要引入 package:flutter/services.dart;

a. LengthLimitingTextInputFormatter 限制最长字符;

b. WhitelistingTextInputFormatter 仅允许输入白名单中字符;如 digitsOnly 仅支持数字 [0-9];

c. BlacklistingTextInputFormatter 防止输入黑名单中字符;如 singleLineFormatter 强制输入单行;

分析源码 RegExp("[/]") 可以设置正则表达式;

17、onChanged 文本内容变更时回调,可实时监听 TextField 输入内容;

18、controller 文本控制器,监听输入内容回调;

19、onTap 点击 TextField时回调;

20、onEditingComplete 在提交内容时回调,通常是点击回车按键时回调;

21、onSubmit 在提交时回调,不可与 onEditingComplete 同时使用,区别在于 onSubmit 是带返回值的回调;

问题小结:

当 TextField 设置 enableInteractiveSelection 属性后长按会出现菜单,默认为英文,可通过设置 Flutter 国际化来处理;

(1)在 pubspec.yaml 中集成 flutter_localizations;

2)在 MaterialApp 中设置本地化代理和支持的语言类型;

(1)将 maxLength 设置为 null 仅使用 LengthLimitingTextInputFormatter 限制最长字符;

(2)设置 InputDecoration 中 decoration 属性为空;但是底部有空余,只是隐藏而并非消失;

Flutter手势(粘贴即用 flutter 1.22.6)

import 'package:flutter/material.dart';

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

class MyAppextends StatelessWidget {

// This widget is the root of your application.

@override

Widgetbuild(BuildContext context) {

return MaterialApp(

title:'Flutter Demo',

  theme:ThemeData(

primarySwatch: Colors.blue, splashColor: Colors.transparent),

  home:HYHomePage(),

);

}

}

class HYHomePageextends StatelessWidget {

@override

Widgetbuild(BuildContext context) {

return Scaffold(

appBar:AppBar(

title:Text("列表测试"),

  ),

  body:GestureDemo(),

  // Center(

//  child: Stack(

//    alignment: Alignment.center,

//    children: [

//      GestureDetector(

//        onTapDown: (details) {

//          print("outer click");

//        },

//        child: Container(

//          width: 200,

//          height: 200,

//          color: Colors.yellow,

//          alignment: Alignment.center,

//        ),

//      ),

//      IgnorePointer(

//        child: GestureDetector(

//          onTapDown: (details) {

//            print("inner click");

//          },

//          child: Container(

//            width: 100,

//            height: 100,

//            color: Colors.red,

//          ),

//        ),

//      )

//    ],

//  ),

// ),

);

}

}

class GestureDemoextends StatelessWidget {

const GestureDemo({

Key key,

}) :super(key: key);

@override

Widgetbuild(BuildContext context) {

return Center(

child:GestureDetector(

onTapDown: (details) {

print("手指按下");

      print(details.globalPosition);

      print(details.localPosition);

    },

    onTapUp: (details) {

print("手指抬起");

    },

    onTapCancel: () {

print("手势取消");

    },

    onTap: () {

print("手势点击");

    },

    onDoubleTap: () {

print("手指双击");

    },

    onLongPress: () {

print("长按手势");

    },

    onPanUpdate: (value){

print('当前我在滑动$value');

    },

    child:Container(

width:200,

      height:200,

      color: Colors.orange,

    ),

  ),

);

}

}

class ListenerDemoextends StatelessWidget {

const ListenerDemo({

Key key,

}) :super(key: key);

@override

Widgetbuild(BuildContext context) {

return Listener(

onPointerDown: (event) {

print("指针按下:$event");

    print(event.position);

    print(event.localPosition);

  },

  onPointerMove: (event) {

//            print("指针移动:$event");

  },

  onPointerUp: (event) {

//            print("指针抬起:$event");

  },

  child:Container(

width:200,

    height:200,

    color: Colors.red,

  ),

);

}

}


分享标题:php筛选数组中的数据库,php数组查询
分享地址:http://njwzjz.com/article/dsgpgpc.html