Показывать значение кнопки в тексте при ее нажатии - Flutter

Я хочу, чтобы при нажатии любой клавиши она отображалась в виджете Text (вместо данных) [см. изображение ниже]. Например, в примере 1 нажимается 1, затем я нажимаю 2, поэтому должно отображаться 12 и т. д. Затем, если я нажимаю конец вызова (нижняя правая кнопка), это поле должно быть очищено.

Изображение здесь

Позвольте мне добавить код ниже,

Column(
    [
     Text("data"),
     Row(
         mainAxisAlignment: MainAxisAlignment.spaceAround,
         children: [
                  GestureDetector(
                      onTap: () {},
                      child: defaultContainer("1")),
                  GestureDetector(
                      onTap: () {},
                      child: defaultContainer("2")),
                  GestureDetector(
                      onTap: () {},
                      child: defaultContainer("3")),
                ],
              ),
.........
     ],
    )
Widget defaultContainer(String value) {
    return Container(
      width: 60,
      height: 60,
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(50),
        boxShadow: const [BoxShadow(blurRadius: 5)],
        color: colors[random.nextInt(8)],
      ),
      child: Center(
          child: Text(
        value,
        style: const TextStyle(fontSize: 30),
      )),
    );
  }

Надеюсь, я смог объяснить.

Если вы используете StatefulWidget, вы можете использовать setState() для обновления вашего значения внутри текста. Объявите переменную String value = "", и onTap() детектора жестов. Вам просто нужно обновить это значение, используя -> setState( () { value = "1"});

Aks 12.04.2023 10:54

вы должны понимать жизненный цикл концепции флаттера (например, состояние инициализации. распоряжаться и т. д.). и для первого важно изучить различные виджеты без сохранения состояния и виджеты с полным состоянием, чтобы четко понимать.

Yogi Arif Widodo 18.04.2023 16:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
61
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать тип строки «данные», чтобы сохранить свои данные: добавить значение в список при нажатии кнопки с цифрой и установить данные = '' при нажатии кнопки завершения вызова.

создайте строковую переменную:

String data = "data";

затем убедитесь, что вы используете класс с сохранением состояния, и добавьте это в функцию onTap:

    setState((){
      data = "1"; 
      //2,3,4......,12 
      //do this for all and to clear just add empty string ""
    }):

Вам нужно дать "данные" динамически. Пример:

String inputValue = '';

то вы можете использовать так:

Column(
    children: [
      Text(inputValue),
      Row(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: [
          GestureDetector(
            onTap: () {
              setState(() {
                inputValue += '1';
              });
            },
            child: defaultContainer("1"),
          ),
          GestureDetector(
            onTap: () {
              setState(() {
                inputValue += '2';
              });
            },
            child: defaultContainer("2"),
          ),
          GestureDetector(
            onTap: () {
              setState(() {
                inputValue += '3';
              });
            },
            child: defaultContainer("3"),
          ),
        ],
      ),
      GestureDetector(
         onTap: () {
            if (inputValue.isNotEmpty) {
              setState(() {
                //if you want to clear one by one
                inputValue = _inputValue.substring(0, inputValue.length - 1);
                //if you want to clear all
                inputValue = "";
              });
            }
          },
          child: defaultContainer("end_icon"),
        ),
      ],
    ),
  ],
),
Ответ принят как подходящий

Вы можете заархивировать это, объявив переменную для хранения числа и используя функцию, которая добавляет цифру к числу при нажатии.

Попробуйте приведенный ниже фрагмент:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  const MyHomePage({
    Key? key,
    required this.title,
  }) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String number = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(number),
            Wrap(
              alignment: WrapAlignment.center,
              children: [
                defaultContainer("1"),
                defaultContainer("2"),
                defaultContainer("3"),
                defaultContainer("4"),
                defaultContainer("5"),
                defaultContainer("6"),
                defaultContainer("7"),
                defaultContainer("8"),
                defaultContainer("9"),
                defaultContainer("0"),
                defaultContainer("0", isClear: true),
              ]
            )
          ],
        ),
      ),
    );
  }
  
  Widget defaultContainer(String value, {bool? isClear}) {
    return InkWell(
    onTap: (){
      setState((){
        if (isClear??false){
          number = "";
        } else {
          number += value;
        }
      });
    },
      child: Container(
      width: 60,
      height: 60,
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(50),
        boxShadow: const [BoxShadow(blurRadius: 5)],
        color: Colors.white,
      ),
      child: Center(
          child: isClear??false?
        const Icon(Icons.call_end):
        Text(
        value,
        style: const TextStyle(fontSize: 30),
      )),
    )
    );
  }
}

Другие вопросы по теме