Я хочу, чтобы при нажатии любой клавиши она отображалась в виджете 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),
)),
);
}
Надеюсь, я смог объяснить.
вы должны понимать жизненный цикл концепции флаттера (например, состояние инициализации. распоряжаться и т. д.). и для первого важно изучить различные виджеты без сохранения состояния и виджеты с полным состоянием, чтобы четко понимать.
Вы можете использовать тип строки «данные», чтобы сохранить свои данные: добавить значение в список при нажатии кнопки с цифрой и установить данные = '' при нажатии кнопки завершения вызова.
создайте строковую переменную:
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),
)),
)
);
}
}
Если вы используете StatefulWidget, вы можете использовать setState() для обновления вашего значения внутри текста. Объявите переменную String value = "", и onTap() детектора жестов. Вам просто нужно обновить это значение, используя -> setState( () { value = "1"});