我在我的项目中使用这个包:持续时间选择器并且我添加了一个新文件来使用文本字段和键盘编辑该持续时间,但是一旦我回到轮子部分,轮子的运动就会变得错误,我想继续使用这个包,这是我的代码:
import 'package:duration_picker/duration_picker.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter App'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
activityDurationDialog(context);
},
child: Text('click'),
)),
);
}
}
Future<void> activityDurationDialog(BuildContext context, {double topBottomPadding = 10}) async {
Duration _duration = Duration(hours: 0, minutes: 0);
TextEditingController _hourController = TextEditingController(text: _duration.inHours.toString());
TextEditingController _minuteController = TextEditingController(text: _duration.inMinutes.remainder(60).toString());
bool isAddedManually = false;
void setIsAddedManually(bool newValue) {
isAddedManually = newValue;
}
await showDialog<void>(
context: context,
barrierDismissible: true,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (context, setState) {
return AlertDialog(
title: Text('duration'),
content: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Divider(color: Colors.black),
Padding(
padding: const EdgeInsets.only(top: 25.0),
child: DurationPicker(
width: MediaQuery.of(context).size.width * 0.9,
duration: _duration,
onChange: (val) {
setState(() {
if (isAddedManually == false) {
_duration = val;
_hourController.text = _duration.inHours.toString();
_minuteController.text = _duration.inMinutes.remainder(60).toString();
} else {
_duration = _duration + val;
_hourController.text = _duration.inHours.toString();
_minuteController.text = _duration.inMinutes.remainder(60).toString();
}
});
},
snapToMins: 5.0,
),
),
],
),
),
),
actions: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.only(left: 8.0),
child: IconButton(
icon: Icon(
Icons.keyboard,
size: 30,
),
onPressed: () {
activityDurationEditingDialog(
context,
_hourController,
_minuteController,
_duration,
setIsAddedManually,
(newDuration) {
setState(() {
_duration = newDuration;
_hourController.text = _duration.inHours.toString();
_minuteController.text = _duration.inMinutes.remainder(60).toString();
});
},
);
},
),
),
],
),
],
);
},
);
},
);
}
Future<void> activityDurationEditingDialog(
BuildContext context,
TextEditingController _hourController,
TextEditingController _minuteController,
Duration _duration,
Function(bool) setIsAddedManually,
Function(Duration) onUpdate, {
double topBottomPadding = 10,
}) async {
return showDialog<void>(
context: context,
barrierDismissible: true,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (context, setState) {
return AlertDialog(
title: Text('edit'),
content: SingleChildScrollView(
child: Column(
children: [
Divider(color: Colors.black),
SizedBox(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Column(
children: [
Text('hour'),
SizedBox(
height: 10,
),
Container(
width: 100,
child: TextField(
decoration: InputDecoration(
border: OutlineInputBorder(),
),
maxLength: 3,
controller: _hourController,
keyboardType: TextInputType.number,
textAlign: TextAlign.center,
onChanged: (value) {
int hours = int.tryParse(value) ?? 0;
setState(() {
_duration = Duration(
hours: hours,
minutes: _duration.inMinutes.remainder(60),
);
});
},
),
),
],
),
Column(
children: [
Text('minute'),
SizedBox(
height: 10,
),
Container(
width: 100,
child: TextField(
decoration: InputDecoration(
border: OutlineInputBorder(),
),
maxLength: 2,
controller: _minuteController,
keyboardType: TextInputType.number,
textAlign: TextAlign.center,
onChanged: (value) {
int minutes = int.tryParse(value) ?? 0;
setState(() {
_duration = Duration(
hours: _duration.inHours,
minutes: minutes,
);
});
},
),
),
],
),
],
),
],
),
),
actions: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.only(left: 8.0),
child: IconButton(
icon: Icon(
Icons.access_time,
size: 30,
),
onPressed: () {
setIsAddedManually(true);
onUpdate(_duration);
Navigator.of(context).pop();
},
),
),
],
),
],
);
},
);
},
);
}
请尝试一下,我被困在那里两天了,谢谢
看,我不明白你的代码,这真的很奇怪,我稍后会先解决这个问题,我找到了解决方案。
问题是当您在其中传递 true 时回调
setIsAddedManually
的函数 activityDurationEditingDialog
,它会使 isAddedManually
的 activityDurationDialog
变量为 true ,这会导致 DurationPicker
的 onChange 的其他部分。这使得持续时间呈指数增长,通过 false setIsAddedManually(false)
解决指数增长问题。
您仍然需要检查为什么 DurationPicker 不会在弹出手动持续时间输入对话框时更新。
关于代码,你可以忽略它:
看,我不知道你为什么要使用高功能,但你不应该用 flutter 来做到这一点,因为 flutter 会堆叠所有功能,这可能会导致内存浪费,而你可以定义具有内容的
StateLess
小部件你的对话很简单。我也不明白你为什么使用 SetIsAddedManually
回调和 isAddedManually
变量。