Flutter入门09 -- 事件监听与路由跳转

2022-01-25  本文已影响0人  zyc_在路上

指针事件Pointer

import 'package:flutter/material.dart';

main() => runApp(SFMyApp());

class SFMyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SFHomePage(),
    );
  }
}

class SFHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("商品列表"),
      ),
      body: Center(
        child: Listener(
          onPointerDown: (event) {
            print("手指按下: $event");
            print(event.position);
            print(event.localPosition);
          },
          onPointerMove: (event) {
            print("手指移动: $event");
          },
          onPointerUp: (event) {
            print("手指抬起: $event");
          },
          onPointerCancel: (event) {
            print("取消 $event");
          },
          child: Container(
            width: 100,
            height: 100,
            color: Colors.red,
          ),
        ),
      )
    );
  }
}

手势识别

手势的分类:
import 'package:flutter/material.dart';

main() => runApp(SFMyApp());

class SFMyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SFHomePage(),
    );
  }
}

class SFHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("商品列表"),
        ),
        body: 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.greenAccent,
            ),
          ),
        )
    );
  }
}
案例演练:组件重叠显示时的手势识别
import 'package:flutter/material.dart';

main() => runApp(SFMyApp());

class SFMyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SFHomePage(),
    );
  }
}

class SFHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("商品列表"),
      ),
      body: Center(
        child: GestureDetector(
          onTapDown: (details) {
            print("outside click");
          },
          child: Container(
            width: 200,
            height: 200,
            color: Colors.red,
            alignment: Alignment.center,
            child: GestureDetector(
              onTapDown: (details) {
                print("inside click");
              },
              child: Container(
                width: 100,
                height: 100,
                color: Colors.green,
              ),
            ),
          ),
        ),
      )
    );
  }
}
image.png
import 'package:flutter/material.dart';

main() => runApp(SFMyApp());

class SFMyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SFHomePage(),
    );
  }
}

class SFHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("商品列表"),
      ),
      body: Center(
        child: Stack(
          alignment: Alignment.center,
          children: [
            GestureDetector(
              onTapDown: (details) {
                print("red click");
              },
              child: Container(
                width: 200,
                height: 200,
                color: Colors.red,
                alignment: Alignment.center,
              )
            ),

            GestureDetector(
              onTapDown: (details) {
                print("greenAccent click");
              },
              child: Container(
                width: 100,
                height: 100,
                color: Colors.green,
              ),
            )
          ],
        )
      )
    );
  }
}
import 'package:flutter/material.dart';

main() => runApp(SFMyApp());

class SFMyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SFHomePage(),
    );
  }
}

class SFHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("商品列表"),
      ),
      body: Center(
        child: Stack(
          alignment: Alignment.center,
          children: [
            GestureDetector(
              onTapDown: (details) {
                print("red click");
              },
              child: Container(
                width: 200,
                height: 200,
                color: Colors.red,
                alignment: Alignment.center,
              )
            ),

            IgnorePointer(
              child: GestureDetector(
                onTapDown: (details) {
                  print("greenAccent click");
                },
                child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.green,
                ),
              ),
            )
          ],
        )
      )
    );
  }
}
跨组件事件的传递
dependencies:
  event_bus: ^1.1.1
import 'package:event_bus/event_bus.dart';
import 'package:flutter/material.dart';

//1.创建全局的EventBus对象
final EventBus eventBus = EventBus();

class SFUserInfo {
  String name;
  int level;

  SFUserInfo(this.name,this.level);
}

main() => runApp(SFMyApp());

class SFMyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SFHomePage(),
    );
  }
}

class SFHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("商品列表"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            SFButton(),
            SFText(),
          ],
        ),
      )
    );
  }
}

class SFButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      child: Text("按钮"),
      onPressed: () {
        print("点击按钮");
        //2.发出事件
        final userInfo = SFUserInfo("liyanyan",100);
        eventBus.fire(userInfo);
      },
    );
  }
}

class SFText extends StatefulWidget {
  @override
  _SFTextState createState() => _SFTextState();
}

class _SFTextState extends State<SFText> {

  String _message = "Hello World";

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    //3.监听事件的类型
    eventBus.on<SFUserInfo>().listen((data) {
      print(data.name);
      print(data.level);
      _message = "${data.name} -- ${data.level}";
    });
  }

  @override
  Widget build(BuildContext context) {
    return Text("Hello World!!!",style: TextStyle(fontSize: 25));
  }
}

路由管理

Route
Navigator
路由的基本使用
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:learn_flutter_01/day02/SFDetail.dart';

main() => runApp(SFMyApp());

class SFMyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SFHomePage(),
    );
  }
}

class SFHomePage extends StatefulWidget {
  @override
  _SFHomePageState createState() => _SFHomePageState();
}

class _SFHomePageState extends State<SFHomePage> {

  String homeMessage = "default message";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("首页"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(homeMessage,style: TextStyle(fontSize: 20)),
            RaisedButton(
              child: Text("跳转到详情页面"),
              onPressed: () {
                goToDetail(context);
              },
            )
          ],
        )
      )
    );
  }

  void goToDetail(BuildContext ctx) {
    Future result = Navigator.of(ctx).push(MaterialPageRoute(
      builder: (ctx) {
        return SFDetail("liyanyan");
      }
    ));

    result.then((value) {
      print(value);
      setState(() {
        homeMessage = value;
      });
    });
  }
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class SFDetail extends StatelessWidget {
  final String message;

  SFDetail(this.message);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("详情页"),
        leading: IconButton(
          icon: Icon(Icons.backspace),
          onPressed: () => backHomePage(context),
        ),
      ),
      body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(message,style: TextStyle(fontSize: 20)),
              RaisedButton(
                child: Text("返回首页"),
                onPressed: () => backHomePage(context),
              )
            ],
          )
      ),
    );
  }

  void backHomePage(BuildContext ctx) {
    Navigator.of(ctx).pop("xie shen fang");
  }
}
void goToDetail(BuildContext ctx) {
    Future result = Navigator.of(ctx).push(MaterialPageRoute(
      builder: (ctx) {
        return SFDetail("liyanyan");
      }
    ));

    result.then((value) {
      print(value);
      setState(() {
        homeMessage = value;
      });
    });
  }
void backHomePage(BuildContext ctx) {
    Navigator.of(ctx).pop("xie shen fang");
  }
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class SFDetail extends StatelessWidget {
  final String message;

  SFDetail(this.message);

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
        //当返回为true时,可以自动返回;
        //当返回为false时,不能自动返回首页,需要我们手写代码进行返回;
        backHomePage(context);
        return Future.value(false);
      },
      child: Scaffold(
        appBar: AppBar(
          title: Text("详情页"),
        ),
        body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text(message,style: TextStyle(fontSize: 20)),
                RaisedButton(
                  child: Text("返回首页"),
                  onPressed: () => backHomePage(context),
                )
              ],
            )
        ),
      ),
    );
  }

  void backHomePage(BuildContext ctx) {
    Navigator.of(ctx).pop("xie shen fang");
  }
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class SFAbout extends StatelessWidget {

  static const String routeName = "SFAbout";

  @override
  Widget build(BuildContext context) {

    final message = ModalRoute.of(context).settings.arguments as String;
    
    return Scaffold(
      appBar: AppBar(
        title: Text("关于页面"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(message),
            RaisedButton(
              child: Text("返回首页"),
              onPressed: () {

              },
            )
          ],
        ),
      ),
    );
  }
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:learn_flutter_01/day02/SFAbout.dart';
import 'package:learn_flutter_01/day02/SFDetail.dart';

main() => runApp(SFMyApp());

class SFMyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        SFHomePage.routeName : (ctx) => SFHomePage(),
        SFAbout.routeName : (ctx) => SFAbout()
      },
      initialRoute: SFHomePage.routeName
    );
  }
}

class SFHomePage extends StatefulWidget {

  static const String routeName = "/";

  @override
  _SFHomePageState createState() => _SFHomePageState();
}

class _SFHomePageState extends State<SFHomePage> {

  String homeMessage = "default message";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("首页"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(homeMessage,style: TextStyle(fontSize: 20)),
            RaisedButton(
              child: Text("跳转到详情页面"),
              onPressed: () {
                goToDetail(context);
              },
            ),
            RaisedButton(
              child: Text("跳转到关于页面"),
              onPressed: () {
                goToAbout(context);
              },
            )
          ],
        )
      )
    );
  }

  void goToDetail(BuildContext ctx) {
    Future result = Navigator.of(ctx).push(MaterialPageRoute(
      builder: (ctx) {
        return SFDetail("liyanyan");
      }
    ));

    result.then((value) {
      print(value);
      setState(() {
        homeMessage = value;
      });
    });
  }

  void goToAbout(BuildContext ctx) {
    Future result = Navigator.of(context).pushNamed(SFAbout.routeName,arguments: "liyanyan");

    result.then((value) {
      print(value);
    });
  }
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:learn_flutter_01/day02/SFAbout.dart';
import 'package:learn_flutter_01/day02/SFDetail.dart';

main() => runApp(SFMyApp());

class SFMyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        SFHomePage.routeName : (ctx) => SFHomePage(),
        SFAbout.routeName : (ctx) => SFAbout()
      },
      initialRoute: SFHomePage.routeName,
      onGenerateRoute: (setttings) {
        if (setttings.name == SFDetail.routeName) {
          return MaterialPageRoute(
              builder: (ctx) {
                return SFDetail(setttings.arguments);
              }
          );
        }
        return null;
      }
    );
  }
}

class SFHomePage extends StatefulWidget {

  static const String routeName = "/";

  @override
  _SFHomePageState createState() => _SFHomePageState();
}

class _SFHomePageState extends State<SFHomePage> {

  String homeMessage = "default message";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("首页"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(homeMessage,style: TextStyle(fontSize: 20)),
            RaisedButton(
              child: Text("跳转到详情页面"),
              onPressed: () {
                goToDetail(context);
              },
            ),
            RaisedButton(
              child: Text("跳转到关于页面"),
              onPressed: () {
                goToAbout(context);
              },
            ),
            RaisedButton(
              child: Text("跳转到详情页面"),
              onPressed: () {
                goToDetail2(context);
              },
            )
          ],
        )
      )
    );
  }

  void goToDetail(BuildContext ctx) {
    Future result = Navigator.of(ctx).push(MaterialPageRoute(
      builder: (ctx) {
        return SFDetail("liyanyan");
      }
    ));

    result.then((value) {
      print(value);
      setState(() {
        homeMessage = value;
      });
    });
  }

  void goToAbout(BuildContext ctx) {
    Future result = Navigator.of(context).pushNamed(SFAbout.routeName,arguments: "liyanyan");

    result.then((value) {
      print(value);
    });
  }

  void goToDetail2(BuildContext ctx) {
    Navigator.of(context).pushNamed(SFDetail.routeName,arguments: "123");
  }
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class SFUnKnownPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("错误页面"),
      ),
      body: Center(
        child: Text("错误页面"),
      ),
    );
  }
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:learn_flutter_01/day02/SFAbout.dart';
import 'package:learn_flutter_01/day02/SFDetail.dart';
import 'package:learn_flutter_01/day02/SFUnknownPage.dart';

main() => runApp(SFMyApp());

class SFMyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        SFHomePage.routeName : (ctx) => SFHomePage(),
        SFAbout.routeName : (ctx) => SFAbout()
      },
      initialRoute: SFHomePage.routeName,
      onGenerateRoute: (setttings) {
        if (setttings.name == SFDetail.routeName) {
          return MaterialPageRoute(
              builder: (ctx) {
                return SFDetail(setttings.arguments);
              }
          );
        }
        return null;
      },
      onUnknownRoute: (settings) {
        return MaterialPageRoute(
          builder: (ctx) {
            return SFUnKnownPage();
          }
        );
      },
    );
  }
}

class SFHomePage extends StatefulWidget {

  static const String routeName = "/";

  @override
  _SFHomePageState createState() => _SFHomePageState();
}

class _SFHomePageState extends State<SFHomePage> {

  String homeMessage = "default message";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("首页"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(homeMessage,style: TextStyle(fontSize: 20)),
            RaisedButton(
              child: Text("跳转到详情页面"),
              onPressed: () {
                goToDetail(context);
              },
            ),
            RaisedButton(
              child: Text("跳转到关于页面"),
              onPressed: () {
                goToAbout(context);
              },
            ),
            RaisedButton(
              child: Text("跳转到详情页面"),
              onPressed: () {
                goToDetail2(context);
              },
            ),
            RaisedButton(
              child: Text("跳转到设置页面"),
              onPressed: () {
                goToAbou2(context);
              },
            )
          ],
        )
      )
    );
  }

  void goToDetail(BuildContext ctx) {
    Future result = Navigator.of(ctx).push(MaterialPageRoute(
      builder: (ctx) {
        return SFDetail("liyanyan");
      }
    ));

    result.then((value) {
      print(value);
      setState(() {
        homeMessage = value;
      });
    });
  }

  void goToAbout(BuildContext ctx) {
    Future result = Navigator.of(context).pushNamed(SFAbout.routeName,arguments: "liyanyan");

    result.then((value) {
      print(value);
    });
  }

  void goToDetail2(BuildContext ctx) {
    Navigator.of(context).pushNamed(SFDetail.routeName,arguments: "123");
  }

  void goToAbou2(BuildContext ctx) {
    ///setting为定义的页面 跳转页面会直接报错
    Navigator.of(context).pushNamed("/settings");
  }
}

import 'package:flutter/material.dart';
import 'package:learn_flutter_01/day02/SFAbout.dart';
import 'package:learn_flutter_01/day02/SFDetail.dart';
import 'package:learn_flutter_01/main.dart';
import '../SFUnknownPage.dart';

class SFRouter {

  static final Map<String,WidgetBuilder> routers = {
    SFHomePage.routeName : (ctx) => SFHomePage(),
    SFAbout.routeName : (ctx) => SFAbout(),
  };

  static final String initialRoute = SFHomePage.routeName;

  static final RouteFactory generateRoute = (settings) {
    if (settings.name == SFDetail.routeName) {
      return MaterialPageRoute(
        builder: (ctx) {
          return SFDetail(settings.arguments);
        }
      );
    }
    return null;
  };

  static final RouteFactory unknownRoute = (settings) {
    return MaterialPageRoute(
        builder: (ctx) {
          return SFUnKnownPage();
        }
    );
  };
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:learn_flutter_01/day02/SFAbout.dart';
import 'package:learn_flutter_01/day02/SFDetail.dart';
import 'package:learn_flutter_01/day02/SFUnknownPage.dart';
import 'package:learn_flutter_01/day02/router/SFRouter.dart';

main() => runApp(SFMyApp());

class SFMyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: SFRouter.routers,
      initialRoute: SFRouter.initialRoute,
      onGenerateRoute: SFRouter.generateRoute,
      onUnknownRoute: SFRouter.unknownRoute,
    );
  }
}

class SFHomePage extends StatefulWidget {

  static const String routeName = "/";

  @override
  _SFHomePageState createState() => _SFHomePageState();
}

class _SFHomePageState extends State<SFHomePage> {

  String homeMessage = "default message";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("首页"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(homeMessage,style: TextStyle(fontSize: 20)),
            RaisedButton(
              child: Text("跳转到详情页面"),
              onPressed: () {
                goToDetail(context);
              },
            ),
            RaisedButton(
              child: Text("跳转到关于页面"),
              onPressed: () {
                goToAbout(context);
              },
            ),
            RaisedButton(
              child: Text("跳转到详情页面"),
              onPressed: () {
                goToDetail2(context);
              },
            ),
            RaisedButton(
              child: Text("跳转到设置页面"),
              onPressed: () {
                goToAbou2(context);
              },
            )
          ],
        )
      )
    );
  }

  void goToDetail(BuildContext ctx) {
    Future result = Navigator.of(ctx).push(MaterialPageRoute(
      builder: (ctx) {
        return SFDetail("liyanyan");
      }
    ));

    result.then((value) {
      print(value);
      setState(() {
        homeMessage = value;
      });
    });
  }

  void goToAbout(BuildContext ctx) {
    Future result = Navigator.of(context).pushNamed(SFAbout.routeName,arguments: "liyanyan");

    result.then((value) {
      print(value);
    });
  }

  void goToDetail2(BuildContext ctx) {
    Navigator.of(context).pushNamed(SFDetail.routeName,arguments: "123");
  }

  void goToAbou2(BuildContext ctx) {
    ///setting为定义的页面 跳转页面会直接报错
    Navigator.of(context).pushNamed("/settings");
  }
}
上一篇 下一篇

猜你喜欢

热点阅读