フォーカス取得時に先頭にカーソルを移動する。

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 Focus(
      onFocusChange: (hasFocus) {
        if(hasFocus) {
          ctler.selection = TextSelection.fromPosition(const TextPosition(offset: 0));
        }
      },
      child:   TextFormField(
      readOnly: !(enabled ?? true),
      obscureText: obscureText ?? false,
      validator: validator, //追加 バリデーション ③
      inputFormatters: inputFormatters, //追加 入力規則 ④
      autovalidateMode: AutovalidateMode.onUserInteraction, //追加 チェックのタイミング ⑤
      controller: ctler,
      maxLines: maxLines ?? 1,
      minLines: minLines ?? 1,
      autofocus: true,
      keyboardAppearance: Brightness.dark,
      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,
        ),
      ),
      )
    );
}
/* -----codeの行番号----- */