Flutter 从设置页面在时间格式(上午/下午和24小时)之间切换
我想在设置页面中设置开关小部件。我可以用SwitchWidget来切换主题,但这太复杂了 我的主页:Flutter 从设置页面在时间格式(上午/下午和24小时)之间切换,flutter,Flutter,我想在设置页面中设置开关小部件。我可以用SwitchWidget来切换主题,但这太复杂了 我的主页: import'包:intl/intl.dart'; 纵队( 儿童:[ 对齐( 对齐:alignment.topCenter, 子项:文本(“摘要”), ), 尺寸箱(高度:45), _time24(快照),//如果开关关闭,则显示此项 _time12(快照),//如果开关打开,则显示此项 ], ) 小部件\u time12(异步快照快照){ 返回列( 儿童:[ _时间(Icons.home、文
import'包:intl/intl.dart';
纵队(
儿童:[
对齐(
对齐:alignment.topCenter,
子项:文本(“摘要”),
),
尺寸箱(高度:45),
_time24(快照),//如果开关关闭,则显示此项
_time12(快照),//如果开关打开,则显示此项
],
)
小部件\u time12(异步快照快照){
返回列(
儿童:[
_时间(Icons.home、文本(DateFormat(“hh:mma”).format(DateFormat(“hh:mm”).parse(snapshot.data.home)),
_时间(Icons.work,Text(DateFormat(“hh:mma”).format(DateFormat(“hh:mm”).parse(snapshot.data.work)),
_时间(Icons.restaurant,Text(DateFormat(“hh:mma”).format(DateFormat(“hh:mm”).parse(snapshot.data.restaurant)),
]);
}
小部件\u time24(异步快照快照){
返回列(
儿童:[
_时间(Icons.home、文本(snapshot.data.home)),
_时间(Icons.work、文本(snapshot.data.work)),
_时间(Icons.restaurant,文本(snapshot.data.restaurant)),
]);
}
您可以复制粘贴运行下面的完整代码您可以等待导航器。按然后调用
setState()
代码片段
onPressed: () async {
await Navigator.push(
context,
MaterialPageRoute(builder: (context) => Setting()),
);
setState(() {});
}
...
else if (snapshot.hasData) {
if (is24) {
return _time24(snapshot);
} else {
return _time12(snapshot);
}
}
工作演示
完整代码
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class Payload {
String home;
String work;
String restaurant;
Payload({this.home, this.work, this.restaurant});
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
Future _future;
void _incrementCounter() {
setState(() {
_counter++;
});
}
Widget _time12(AsyncSnapshot snapshot) {
var a = DateFormat("HH:mm").parse(snapshot.data.home);
print("a ${a}");
return Column(children: <Widget>[
_time(
Icons.home,
Text(DateFormat("hh:mma")
.format(DateFormat("HH:mm").parse(snapshot.data.home)))),
_time(
Icons.work,
Text(DateFormat("hh:mma")
.format(DateFormat("HH:mm").parse(snapshot.data.work)))),
_time(
Icons.restaurant,
Text(DateFormat("hh:mma")
.format(DateFormat("HH:mm").parse(snapshot.data.restaurant)))),
]);
}
Widget _time24(AsyncSnapshot snapshot) {
return Column(children: <Widget>[
_time(Icons.home, Text(snapshot.data.home)),
_time(Icons.work, Text(snapshot.data.work)),
_time(Icons.restaurant, Text(snapshot.data.restaurant)),
]);
}
Widget _time(IconData iconData, Text _text) {
return ListTile(
leading: Icon(iconData),
title: _text,
);
}
Future<Payload> getData() {
print("getData");
return Future.value(
Payload(home: "18:00", restaurant: "13:00", work: "08:00"));
}
@override
void initState() {
// TODO: implement initState
_future = getData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FutureBuilder<Payload>(
future: _future,
builder: (BuildContext context, AsyncSnapshot<Payload> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
return Text('Press button to start.');
case ConnectionState.active:
case ConnectionState.waiting:
return Text('Awaiting result...');
case ConnectionState.done:
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
else if (snapshot.hasData) {
if (is24) {
return _time24(snapshot);
} else {
return _time12(snapshot);
}
}
}
return null; // unreachable
},
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
await Navigator.push(
context,
MaterialPageRoute(builder: (context) => Setting()),
);
setState(() {});
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
bool is24 = true;
class Setting extends StatefulWidget {
@override
_SettingState createState() => _SettingState();
}
class _SettingState extends State<Setting> {
void _changed(value) {
setState(() {
is24 = value;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Second Route"),
),
body: Container(
child: Switch(
value: is24,
onChanged: _changed,
)));
}
}
导入“包装:颤振/材料.省道”;
导入“包:intl/intl.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类有效载荷{
串回家;
弦乐作品;
弦餐厅;
有效载荷({this.home,this.work,this.restaurant});
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
int _计数器=0;
未来,未来;;
void _incrementCounter(){
设置状态(){
_计数器++;
});
}
小部件\u time12(异步快照快照){
var a=DateFormat(“HH:mm”).parse(snapshot.data.home);
打印(“a${a}”);
返回列(子项:[
_时间(
我的家,
文本(日期格式(“hh:mma”)
.format(DateFormat(“HH:mm”).parse(snapshot.data.home)),
_时间(
工作,
文本(日期格式(“hh:mma”)
.format(DateFormat(“HH:mm”).parse(snapshot.data.work)),
_时间(
餐厅,
文本(日期格式(“hh:mma”)
.format(DateFormat(“HH:mm”).parse(snapshot.data.restaurant)),
]);
}
小部件\u time24(异步快照快照){
返回列(子项:[
_时间(Icons.home、文本(snapshot.data.home)),
_时间(Icons.work、文本(snapshot.data.work)),
_时间(Icons.restaurant,文本(snapshot.data.restaurant)),
]);
}
小部件时间(IconData IconData,文本){
返回列表块(
领先:图标(Iconda),
标题:(正文),
);
}
未来的getData(){
打印(“获取数据”);
返回未来值(
有效载荷(家:“18:00”,餐厅:“13:00”,工作:“08:00”);
}
@凌驾
void initState(){
//TODO:实现initState
_future=getData();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
未来建设者(
未来:未来,
生成器:(BuildContext上下文,异步快照){
交换机(快照.连接状态){
案例连接状态。无:
返回文本('按下按钮开始');
案例连接状态.active:
案例连接状态。正在等待:
返回文本('等待结果…');
案例连接状态。完成:
if(snapshot.hasError)
返回文本('Error:${snapshot.Error}');
else if(snapshot.hasData){
如果(is24){
返回时间24(快照);
}否则{
返回时间12(快照);
}
}
}
返回null;//不可访问
},
),
],
),
),
浮动操作按钮:浮动操作按钮(
onPressed:()异步{
等待导航器(
上下文
MaterialPage路由(生成器:(上下文)=>Setting()),
);
setState((){});
},
工具提示:“增量”,
子:图标(Icons.add),
),
);
}
}
bool为24=真;
类设置扩展了StatefulWidget{
@凌驾
_SettingState createState()=>_SettingState();
}
类设置状态扩展状态{
void\u已更改(值){
设置状态(){
is24=数值;
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“第二条路线”),
),
主体:容器(
孩子:开关(
值:is24,
一旦改变:_改变,
)));
}
}
谢谢,它很管用!!但有什么办法可以将设置的页面分离到另一个dart文件中吗?我尝试了两种方法,但数据无法传递到主文件。编辑:当我关闭应用程序时,设置会重置为24小时问题1:只需将类移动到另一个文件并导入,您无需传递它。问题2:您可以使用