Flutter事件监听、路由导航
事件
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue, splashColor: Colors.transparent),
home: HYHomePage(),
);
}
}
class HYHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("列表测试"),
),
body: Center(
child: Stack(
alignment: Alignment.center,
children: <Widget>[
GestureDetector(
onTapDown: (details) {
print("outer click");
},
child: Container(
width: 200,
height: 200,
color: Colors.yellow,
alignment: Alignment.center,
),
),
IgnorePointer(
child: GestureDetector(
onTapDown: (details) {
print("inner click");
},
child: Container(
width: 100,
height: 100,
color: Colors.red,
),
),
)
],
),
),
);
}
}
class GestureDemo extends StatelessWidget {
const GestureDemo({
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: GestureDetector(
onTapDown: (details) {
print("手指按下");
print(details.globalPosition);
print(details.localPosition);
},
onTapUp: (details) {
print("手指抬起");
},
onTapCancel: () {
print("手势取消");
},
onTap: () {
print("手势点击");
},
onDoubleTap: () {
print("手指双击");
},
onLongPress: () {
print("长按手势");
},
child: Container(
width: 200,
height: 200,
color: Colors.orange,
),
),
);
}
}
class ListenerDemo extends StatelessWidget {
const ListenerDemo({
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Listener(
onPointerDown: (event) {
print("指针按下:$event");
print(event.position);
print(event.localPosition);
},
onPointerMove: (event) {
// print("指针移动:$event");
},
onPointerUp: (event) {
// print("指针抬起:$event");
},
child: Container(
width: 200,
height: 200,
color: Colors.red,
),
);
}
}
eventbus
- 需要导入插件,网址: https://pub.dev/
![](https://i-blog.csdnimg.cn/blog_migrate/86b926b542f09fbcf34cd379fb1c6b80.png)
import 'package:event_bus/event_bus.dart';
final eventBus = EventBus();
import 'package:flutter/material.dart';
import 'event_bus.dart';
// 1.创建全局的EventBus对象
class UserInfo {
String nickname;
int level;
UserInfo(this.nickname, this.level);
}
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue, splashColor: Colors.transparent),
home: HYHomePage(),
);
}
}
class HYHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("列表测试"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
HYButton(),
HYText()
],
),
),
);
}
}
class HYButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RaisedButton(
child: Text("按钮"),
onPressed: () {
// 2.发出事件
final info = UserInfo("coderwhy", 18);
eventBus.fire(info);
},
);
}
}
class HYText extends StatefulWidget {
@override
_HYTextState createState() => _HYTextState();
}
class _HYTextState extends State<HYText> {
String _message = "Hello World";
@override
void initState() {
super.initState();
// 3.监听事件的类型
eventBus.on<UserInfo>().listen((data) {
print(data.nickname);
print(data.level);
setState(() {
_message = "${data.nickname}-${data.level}";
});
});
}
@override
Widget build(BuildContext context) {
return Text(_message, style: TextStyle(fontSize: 20),);
}
}
路由
![](https://i-blog.csdnimg.cn/blog_migrate/d44d65976e8e90efe85d6ce99648c01a.png)
import 'package:flutter/material.dart';
import '../main.dart';
import '../about.dart';
import '../detail.dart';
import '../unknown.dart';
class HYRouter {
static final Map<String, WidgetBuilder> routes = {
HYHomePage.routeName: (ctx) => HYHomePage(),
HYAboutPage.routeName: (ctx) => HYAboutPage()
};
static final String initialRoute = HYHomePage.routeName;
static final RouteFactory generateRoute = (settings) {
if (settings.name == HYDetailPage.routeName) {
return MaterialPageRoute(
builder: (ctx) {
return HYDetailPage(settings.arguments);
}
);
}
return null;
};
static final RouteFactory unknownRoute = (settings) {
return MaterialPageRoute(
builder: (ctx) {
return HYUnknownPage();
}
);
};
}
import 'package:flutter/material.dart';
import 'package:learn_flutter/_11_router/about.dart';
import 'package:learn_flutter/_11_router/router/router.dart';
import 'package:learn_flutter/_11_router/unknown.dart';
import 'detail.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue, splashColor: Colors.transparent),
routes: HYRouter.routes,
initialRoute: HYRouter.initialRoute,
onGenerateRoute: HYRouter.generateRoute,
onUnknownRoute: HYRouter.unknownRoute,
);
}
}
class HYHomePage extends StatefulWidget {
static const String routeName = "/";
@override
_HYHomePageState createState() => _HYHomePageState();
}
class _HYHomePageState extends State<HYHomePage> {
String _homeMessage = "default message";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("首页"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(_homeMessage, style: TextStyle(fontSize: 20, color: Colors.red),),
RaisedButton(
child: Text("跳转到详情"),
onPressed: () => _jumpToDetail(context),
),
RaisedButton(
child: Text("跳转到关于"),
onPressed: () => _jumpToAbout(context),
),
RaisedButton(
child: Text("跳转到详情"),
onPressed: () => _jumpToDetail2(context),
),
RaisedButton(
child: Text("跳转到设置"),
onPressed: () => _jumpToSettings(context),
),
],
),
),
);
}
void _jumpToDetail(BuildContext context) {
// 1.普通的跳转方式
// 传递参数: 通过构造器直接传递即可
Future result = Navigator.of(context).push(MaterialPageRoute(
builder: (ctx) {
return HYDetailPage("a home message");
}
));
result.then((res) {
setState(() {
_homeMessage = res;
});
});
}
void _jumpToAbout(BuildContext context) {
Navigator.of(context).pushNamed(HYAboutPage.routeName, arguments: "a home message");
}
void _jumpToDetail2(BuildContext context) {
Navigator.of(context).pushNamed(HYDetailPage.routeName, arguments: "a home detail2 message");
}
void _jumpToSettings(BuildContext context) {
Navigator.of(context).pushNamed("/aaaa");
}
}
import 'package:flutter/material.dart';
class HYDetailPage extends StatelessWidget {
static const String routeName = "/detail";
final String _message;
HYDetailPage(this._message);
@override
Widget build(BuildContext context) {
return WillPopScope(
// 当返回为true时,可以自动返回(flutter帮助我们执行返回操作)
// 当返回为false时, 自行写返回代码
onWillPop: () {
_backToHome(context);
return Future.value(false);
},
child: Scaffold(
appBar: AppBar(
title: Text("详情页"),
// leading: IconButton(
// icon: Icon(Icons.arrow_back),
// onPressed: () => _backToHome(context),
// ),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(_message, style: TextStyle(fontSize: 20),),
RaisedButton(
child: Text("回到首页"),
onPressed: () => _backToHome(context),
)
],
),
),
),
);
}
void _backToHome(BuildContext context) {
Navigator.of(context).pop("a detail message");
}
}
import 'package:flutter/material.dart';
class HYAboutPage extends StatelessWidget {
static const String routeName = "/detail";
@override
Widget build(BuildContext context) {
final String message = ModalRoute.of(context).settings.arguments as String;
return Scaffold(
appBar: AppBar(
title: Text("关于页"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(message),
RaisedButton(
child: Text("返回首页"),
onPressed: () {
Navigator.of(context).pop();
},
)
],
),
),
);
}
}
import 'package:flutter/material.dart';
class HYUnknownPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("错误页面"),
),
body: Center(
child: Text("错误页面", style: TextStyle(fontSize: 20, color: Colors.red),),
),
);
}
}