Как создать поле ввода числа во Flutter?

129

Я не могу найти способ создать поле ввода во Flutter, которое открывало бы цифровую клавиатуру. Возможно ли это с виджетами материалов Flutter? Некоторые обсуждения на github, похоже, указывают на то, что это поддерживаемая функция, но я не могу найти по ней никакой документации.

Янне Аннала
источник
добавить тип клавиатуры keyboardType: TextInputType.number,
Ишан Фернандо

Ответы:

253

Вы можете указать номер как keyboardType для TextField, используя:

keyboardType: TextInputType.number

Проверьте мой файл main.dart

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new MaterialApp(
      home: new HomePage(),
      theme: new ThemeData(primarySwatch: Colors.blue),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new HomePageState();
  }
}

class HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      backgroundColor: Colors.white,
      body: new Container(
          padding: const EdgeInsets.all(40.0),
          child: new Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          new TextField(
            decoration: new InputDecoration(labelText: "Enter your number"),
            keyboardType: TextInputType.number,
            inputFormatters: <TextInputFormatter>[
    FilteringTextInputFormatter.digitsOnly
], // Only numbers can be entered
          ),
        ],
      )),
    );
  }
}

введите описание изображения здесь

Риссмон Суреш
источник
3
Молодец, спасибо! Мне очень хотелось бы, чтобы документация конструктора Flutter была не так плохо отформатирована. Совершенно пропустил это.
Janne Annala
8
Но я могу вставить тексты (символы) в это поле, у вас есть другие варианты? @Rissmon Суреш
Thirumal Govindaraj
5
не забываем => import 'package: flutter / services.dart';
Уилмер
Позволяет ставить точку, пробел и вставлять эмодзи
agilob
5
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly] также требуется здесь, так как здесь в ответе можно использовать запятую и точку.
Рави Ядав,
81

Для тех, кто хочет создавать TextFieldили TextFormFieldпринимать только числа в качестве входных данных, попробуйте этот блок кода:

TextFormField(
    controller: _controller,
    keyboardType: TextInputType.number,
    inputFormatters: <TextInputFormatter>[
        WhitelistingTextInputFormatter.digitsOnly
    ],
    decoration: InputDecoration(
        labelText:"whatever you want", 
        hintText: "whatever you want",
        icon: Icon(Icons.phone_iphone)
    )
)
Билал Шимшек
источник
3
Это приветствуется, чтобы пользователь не вставлял нецифровые строки (inputFormatters), спасибо.
Мариано Арганьярас
2
Это хорошо работает даже во Flutter_web. Причина, по которой мы не можем использовать числовую клавиатуру во flutter_web, поэтому ограничение - естественный вариант. Спасибо @ Bilalimşek
Abhilash Chandran
1
Это идеальное решение!
Кавинда Джаякоди,
31

С помощью этой опции вы можете строго ограничить другой символ без номера.

 inputFormatters: [WhitelistingTextInputFormatter.digitsOnly],
 keyboardType: TextInputType.number,

Для использования вышеуказанного варианта вам необходимо импортировать этот

import 'package:flutter/services.dart';

используя этот вариант, пользователь не может вставлять символ в текстовое поле

Хардик Кумбхани
источник
это действительно исчерпывающий ответ. без форматеров просто настройки клавиатуры недостаточно.
shababhsiddique
если мне нужны только десятичные числа и цифры. как добавить "." в белый список форматтера?
shababhsiddique
19

Установите клавиатуру и валидатор

String numberValidator(String value) {
  if(value == null) {
    return null;
  }
  final n = num.tryParse(value);
  if(n == null) {
    return '"$value" is not a valid number';
  }
  return null;
}

new TextFormField(
    keyboardType: TextInputType.number, 
    validator: numberValidator, 
    textAlign: TextAlign.right
    ...
Гюнтер Цохбауэр
источник
Получена ошибка: нельзя ссылаться на локальную переменную num до ее объявления
kashlo
Хорошо, имя numпеременной не работает. Имя необходимо изменить
Гюнтер Цохбауэр
1
Из документации: параметр onError устарел и будет удален. Вместо num.parse (string, (string) {...}) вы должны использовать num.tryParse (string) ?? (...).
kashlo
13

Для тех, кому нужно работать с денежным форматом в текстовых полях:

Использовать только:, (запятая) и.(период)

и заблокируйте символ: - (дефис, минус или тире)

а также: ⌴ (пробел)

В текстовом поле просто установите следующий код:

keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [BlacklistingTextInputFormatter(new RegExp('[\\-|\\ ]'))],

Символы, дефис и пробел по-прежнему будут отображаться на клавиатуре, но будут заблокированы.

Феллипе Санчес
источник
Вы знаете, как разрешить только одну запятую или точку?
Heddie Franco
1
@HeddieFranco прочитал о регулярных выражениях developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
Феллипе Санчес
2

Вы можете легко изменить тип ввода с помощью параметра keyboardType, и у вас есть много возможностей, проверьте документацию TextInputType, чтобы вы могли использовать номер или телефонное значение

 new TextField(keyboardType: TextInputType.number)
Рауф Рахиш
источник
2

Вы можете попробовать это:

TextFormField(
     keyboardType: TextInputType.number,
     decoration: InputDecoration(
              prefixIcon: Text("Enter your number: ")
     ),
     initialValue: "5",
     onSaved: (input) => _value = num.tryParse(input),
),
Хасан А Юсеф
источник
1

keyboardType: TextInputType.number открывал бы цифровую клавиатуру в фокусе, я бы очищал текстовое поле, когда пользователь вводит / проходит что-либо еще.

keyboardType: TextInputType.number,
onChanged: (String newVal) {
    if(!isNumber(newVal)) {
        editingController.clear();
    }
}

// Function to validate the number
bool isNumber(String value) {
    if(value == null) {
        return true;
    }
    final n = num.tryParse(value);
    return n!= null;
}
Лахар Шах
источник
1

Вот код реальной телефонной клавиатуры на Android:

Часть ключа: keyboardType: TextInputType.phone,

  TextFormField(
    style: TextStyle(
      fontSize: 24
    ),
    controller: _phoneNumberController,
    keyboardType: TextInputType.phone,
    decoration: InputDecoration(
      prefixText: "+1 ",
      labelText: 'Phone number'),
    validator: (String value) {
      if (value.isEmpty) {
        return 'Phone number (+x xxx-xxx-xxxx)';
      }
      return null;
    },
  ),
Андрей
источник
0

Вот код для цифровой клавиатуры: keyboardType: TextInputType.phone Когда вы добавляете этот код в текстовое поле, открывается цифровая клавиатура.

  final _mobileFocus = new FocusNode();
  final _mobile = TextEditingController();


     TextFormField(
          controller: _mobile,
          focusNode: _mobileFocus,
          maxLength: 10,
          keyboardType: TextInputType.phone,
          decoration: new InputDecoration(
            counterText: "",
            counterStyle: TextStyle(fontSize: 0),
            hintText: "Mobile",
            border: InputBorder.none,
            hintStyle: TextStyle(
              color: Colors.black,
                fontSize: 15.0.
            ),
          ),
          style: new TextStyle(
              color: Colors.black,
              fontSize: 15.0,
           ),
          );
Парас Шарма
источник
Добро пожаловать в Stack Overflow! Пожалуйста, включите хотя бы некоторый контекст того, как это работает с кодом.
Цзысюань,
0

Для ввода чисел или цифровой клавиатуры вы можете использовать keyboardType: TextInputType.number

TextFormField(
  decoration: InputDecoration(labelText:'Amount'),
    controller: TextEditingController(
  ),
  validator: (value) {
    if (value.isEmpty) {
      return 'Enter Amount';
    }
  },
  keyboardType: TextInputType.number
)
протекать хурам
источник