您可以在下面复制粘贴运行 2 个完整代码
解决方案 1:快速修复当前代码
您可以使用Future.delayed 和FocusManager.instance.primaryFocus.unfocus
onTap: () async {
Navigator.of(context).push(
showPicker(
context: context,
value: _time,
onChange: onTimeChanged,
is24HrFormat: true,
),
);
await Future.delayed(Duration(milliseconds: 50), () {
FocusManager.instance.primaryFocus.unfocus();
});
})
解决方案 2:假设您不需要一直显示键盘
您可以使用GestureDetector wrap TextFormField 并将enable 设置为false
GestureDetector(
onTap: () async {
Navigator.of(context).push(
showPicker(
context: context,
value: _time,
onChange: onTimeChanged,
is24HrFormat: true,
),
);
},
child: TextFormField(
enabled: false,
工作演示 1
工作演示 2
完整代码 1
import 'package:day_night_time_picker/lib/daynight_timepicker.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
TextEditingController _startTime = TextEditingController();
final _formKey = GlobalKey<FormState>();
Widget _createTimePicker(String text, TextEditingController controller) {
return Container(
margin: EdgeInsets.symmetric(vertical: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
text,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
),
SizedBox(
height: 10,
),
TextFormField(
//enabled: false,
validator: (String value) {
if (value.isEmpty) {
return 'Please enter some text';
}
return null;
},
controller: controller,
decoration: InputDecoration(
errorStyle: TextStyle(color: Colors.red),
border: InputBorder.none,
fillColor: Color(0xfff3f3f4),
filled: true),
onTap: () async {
Navigator.of(context).push(
showPicker(
context: context,
value: _time,
onChange: onTimeChanged,
is24HrFormat: true,
),
);
await Future.delayed(Duration(milliseconds: 200), () {
FocusManager.instance.primaryFocus.unfocus();
});
})
],
),
);
}
TimeOfDay _time = TimeOfDay.now().replacing(minute: 30);
void onTimeChanged(TimeOfDay newTime) {
setState(() {
_time = newTime;
_startTime.text = _time.format(context);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
_createTimePicker("", _startTime),
ElevatedButton(
onPressed: () {
if (_formKey.currentState.validate()) {}
},
child: Text('Submit'),
)
],
),
),
),
);
}
}
完整代码2
import 'package:day_night_time_picker/lib/daynight_timepicker.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
TextEditingController _startTime = TextEditingController();
final _formKey = GlobalKey<FormState>();
Widget _createTimePicker(String text, TextEditingController controller) {
return Container(
margin: EdgeInsets.symmetric(vertical: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
text,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
),
SizedBox(
height: 10,
),
GestureDetector(
onTap: () async {
Navigator.of(context).push(
showPicker(
context: context,
value: _time,
onChange: onTimeChanged,
is24HrFormat: true,
),
);
},
child: TextFormField(
enabled: false,
validator: (String value) {
if (value.isEmpty) {
return 'Please enter some text';
}
return null;
},
controller: controller,
decoration: InputDecoration(
errorStyle: TextStyle(color: Colors.red),
border: InputBorder.none,
fillColor: Color(0xfff3f3f4),
filled: true),
),
)
],
),
);
}
TimeOfDay _time = TimeOfDay.now().replacing(minute: 30);
void onTimeChanged(TimeOfDay newTime) {
setState(() {
_time = newTime;
_startTime.text = _time.format(context);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
_createTimePicker("", _startTime),
ElevatedButton(
onPressed: () {
if (_formKey.currentState.validate()) {}
},
child: Text('Submit'),
)
],
),
),
),
);
}
}