在项目中经常需要返回特定数据,或者传递参数给上一页
返回1
onPressed: () {
Map infos = {};
infos["nickname"] = nicknamelast;
infos["avatar"] = avatar;
Navigator.of(context).pop(infos);
}
返回2
Flutter中可以通过WillPopScope来实现返回按钮拦截
onWillPop是一个WillPopScope的回调函数,当用户点击返回按钮时被调用
WillPopScope必须包含child,否则会报错
WillPopScope(
child:...,
onWillPop: () {
Map infos = {};
infos["nickname"] = nicknamelast;
infos["avatar"] = avatar;
Navigator.of(context).pop(infos);
},
源码:
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'framework.dart';
import 'navigator.dart';
import 'routes.dart';
///为用户否决尝试注册一个回调,以取消封闭
///[ModalRoute]。
///
///也可以看看:
///
///*[ModalRoute.addScopedWillPopCallback]和[ModalRoute.removeScopedWillPopCallback],
///此小部件用来注册和注销[onWillPop]的代码。
class WillPopScope extends StatefulWidget {
///创建一个小部件,该小部件注册用户对否决尝试的回调
///关闭封闭的[ModalRoute]。
///
///[child]参数不能为null。
const WillPopScope({
Key key,
@required this.child,
@required this.onWillPop,
}) : assert(child != null),
super(key: key);
/// The widget below this widget in the tree.
///
/// {@macro flutter.widgets.child}
final Widget child;
///由用户调用否决尝试以消除封闭的[ModalRoute]。
///
///如果回调返回的Future解析为false,则包含
///不会弹出路线。
final WillPopCallback onWillPop;
@override
_WillPopScopeState createState() => _WillPopScopeState();
}
class _WillPopScopeState extends State<WillPopScope> {
ModalRoute<dynamic> _route;
@override
void didChangeDependencies() {
super.didChangeDependencies();
if (widget.onWillPop != null)
_route?.removeScopedWillPopCallback(widget.onWillPop);
_route = ModalRoute.of(context);
if (widget.onWillPop != null)
_route?.addScopedWillPopCallback(widget.onWillPop);
}
@override
void didUpdateWidget(WillPopScope oldWidget) {
super.didUpdateWidget(oldWidget);
assert(_route == ModalRoute.of(context));
if (widget.onWillPop != oldWidget.onWillPop && _route != null) {
if (oldWidget.onWillPop != null)
_route.removeScopedWillPopCallback(oldWidget.onWillPop);
if (widget.onWillPop != null)
_route.addScopedWillPopCallback(widget.onWillPop);
}
}
@override
void dispose() {
if (widget.onWillPop != null)
_route?.removeScopedWillPopCallback(widget.onWillPop);
super.dispose();
}
@override
Widget build(BuildContext context) => widget.child;
}
接受
onPressed: () {
Navigator.pushNamed(context, route.OpenPersonInfoPage)
.then((value) {
setState(() {
print(value.toString());
Map agrs = value;
Config.UInfo.nickname = agrs["nickname"];
Config.UInfo.avatar = agrs["avatar"];
});
这样的话,就可以在按返回按钮的时候返回数据,
在这儿还可以向大家介绍如何双击退出程序
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return WillPopTest();
}
}
class WillPopTest extends State {
DateTime _lastTime;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
backgroundColor: Colors.blue,
centerTitle: true,
title: Text(
'实现二次点击退出',
style: TextStyle(fontSize: 18, color: Colors.white),
),
),
body: WillPopScope(
onWillPop: ()async{
if(_lastTime==null||DateTime.now().difference(_lastTime)>Duration(seconds: 1)){
_lastTime=DateTime.now();
Fluttertoast.showToast(msg: "再点击一次退出app",
fontSize: 16,
backgroundColor: Colors.blue,
textColor: Colors.white
);
return false;
}
return true;
},
child: Container(
alignment: Alignment.center,
child: Text(
"1秒内连续按两次返回键退出",
style: TextStyle(fontSize: 30),
),
),
),
),
);
}
}