Widget nikoText({ required TextEditingController ctler, required String label, required Function(String? newValue) fnc, final List<TextInputFormatter>? inputFormatters, //追加 入力規則 ① final String? Function(String?)? validator, //追加 検査者 ② TextInputType? keyboardType, int? maxLines, int? minLines, bool? obscureText, // 入力内容をマスクする bool? enabled, }){ return TextFormField( readOnly: !(enabled ?? true) , obscureText: obscureText ?? false, validator: validator, //追加 バリデーション ③ inputFormatters: inputFormatters, //追加 入力規則 ④ autovalidateMode: AutovalidateMode.onUserInteraction, //追加 チェックのタイミング ⑤ controller: ctler, maxLines: maxLines ?? 1, minLines: minLines ?? 1, style: const TextStyle(fontSize: 20,), onChanged:(String? newValue) => fnc(newValue), keyboardType: keyboardType, decoration: InputDecoration( isDense:true, border: const OutlineInputBorder(), filled: true, // fillColorで指定した色で塗り潰し fillColor: Colors.white, labelText: label, hintText: ' ', alignLabelWithHint: true, //開始位置を上寄せ // suffixIcon: IconButton( // padding: const EdgeInsets.all(0), // icon: const Icon(Icons.clear), // onPressed: ()=> ctler.clear(), // ), suffixIconConstraints: const BoxConstraints(maxWidth: 23,minWidth:10), contentPadding: const EdgeInsets.symmetric( vertical: 12, horizontal: 4, ), ), ); }
使い方
child: nikoText( label:'距離',ctler:heCmtCtl, //数値キーボード keyboardType:TextInputType.number, //数値のみ inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'[0-9.]')), ], // validator: // (value) { // if (value == null || value.isEmpty) { // return null; // } // debugPrint(value); // // 正規表現を使用して、数値と小数点以外の文字を検出します。 // RegExp regExp = RegExp(r"[^0-9.]"); // if (regExp.hasMatch(value)) { // return '数値と小数点以外の文字は入力できません。'; // } // return null; // }, fnc:(String? newValue)=> ref.read(scEditState.notifier).update((state) => state.copyWith.detail(heComment: newValue ?? '' )) )