1
class InputMdnWidget extends StatefulWidget {
  const InputMdnWidget({Key key}) : super(key: key);
  @override
  _InputMdnWidgetState createState() => _InputMdnWidgetState();
}

class _InputMdnWidgetState extends State<InputMdnWidget> {
  TextEditingController _controller;
  
  @override
  void initState() {

    super.initState();
    _controller = TextEditingController();
  }
  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _controller,
      textCapitalization: TextCapitalization.words       
    );
  }
}

我是 Flutter 的新手,我有一个文本字段并使用控制器,我想将用户输入的文本设为驼峰式,例如用户键入“lala lala”,文本字段中的文本将更改为“Lala Lala”,这可能吗?如何?

我使用 textCapitalization:TextCapitalization.words 不起作用

4

2 回答 2

0

这样你也可以处理web。您也可以查看此答案以获取格式说明

把它放在某个地方

extension CapExtension on String {
  String get inCaps =>
      this.length > 0 ? '${this[0].toUpperCase()}${this.substring(1)}' : '';

  String get capitalizeFirstofEach => this
      .replaceAll(RegExp(' +'), ' ')
      .split(" ")
      .map((str) => str.inCaps)
      .join(" ");
}

并像text.capitalizeFirstofEach.

import 'package:flutter/material.dart';

class Expandeddd extends StatefulWidget {
  Expandeddd({Key? key}) : super(key: key);

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


class _ExpandedddState extends State<Expandeddd> {
  final controller = TextEditingController();

  @override
  void initState() {
    super.initState();
    controller.addListener(() {
      final text = controller.text;

      /// dont set Text here
      controller.selection =
          TextSelection.fromPosition(TextPosition(offset: text.length));
    });
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        constraints: BoxConstraints(
          maxHeight: 812,
          minHeight: 300,
        ),
        child: Column(
          children: [
            TextField(
              controller: controller,
              textCapitalization: TextCapitalization.words,
              keyboardType: TextInputType.text,
              autocorrect: false,
              onChanged: (value) {
                controller.text = value.capitalizeFirstofEach;
              },
              style: TextStyle(
                fontSize: 30.0,
                color: Colors.black,
                fontWeight: FontWeight.bold,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

于 2021-07-30T09:25:33.630 回答
0

您可以尝试使用TextInputFormatters。这些使输入符合特定的模式,并且可以TextFields像这样提供:

TextField(
  controller: _controller,
  inputFormatters: [MyInputFormatter()],       
);

如果您想要自定义格式,并且我认为您想要“标题大小写”,您可以TextInputFormatter通过像这样扩展类来创建自己的:

import 'package:flutter/services.dart';

class TitleCaseInputFormatter extends TextInputFormatter {
  String textToTitleCase(String text) {
    if (text.length > 1) {
      return text[0].toUpperCase() + text.substring(1);
      /*or text[0].toUpperCase() + text.substring(1).toLowerCase(), if you want absolute title case*/
    } else if (text.length == 1) {
      return text[0].toUpperCase();
    }

    return '';
  }

  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    String formattedText = newValue.text
        .split(' ')
        .map((element) => textToTitleCase(element))
        .toList()
        .join(' ');
    return TextEditingValue(
      text: formattedText,
      selection: newValue.selection,
    );
  }
}

同样,像这样使用它:

TextField(
  controller: _controller,
  inputFormatters: [TitleCaseInputFormatter()],       
);
于 2021-07-30T09:53:38.157 回答