Flutter 从设置页面在时间格式(上午/下午和24小时)之间切换

Flutter 从设置页面在时间格式(上午/下午和24小时)之间切换,flutter,Flutter,我想在设置页面中设置开关小部件。我可以用SwitchWidget来切换主题,但这太复杂了 我的主页: import'包:intl/intl.dart'; 纵队( 儿童:[ 对齐( 对齐:alignment.topCenter, 子项:文本(“摘要”), ), 尺寸箱(高度:45), _time24(快照),//如果开关关闭,则显示此项 _time12(快照),//如果开关打开,则显示此项 ], ) 小部件\u time12(异步快照快照){ 返回列( 儿童:[ _时间(Icons.home、文

我想在设置页面中设置开关小部件。我可以用SwitchWidget来切换主题,但这太复杂了

我的主页:

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:您可以使用