《flutter实战》CH2总结
路由管理
示例
onPressed: () {
  Navigator.push(context,
    MaterialPageRoute(builder:    (context){
      return NewRoute();
    })
  );  
}
MaterialPageRoute
- 继承自PageRoute,自定义路由切换需要继承自PageRoute
- 构造函数
    MaterialPageRoute({ WidgetBuilder builder, // 构建路由页面的具体内容,返回一个widget RouteSettings settings, // 包含路由配置信息,如路由名称 bool maintainState = true,// 设为false,在路由没用的时候释放资源 bool fullscreenDialog = false, // 是否全屏模态对话框,设为true,ios新页面改为从底部滑入 })
Navigator
- 路由入栈 Future push(BuildContext context, Route route)
- 
    栈顶路由出栈 bool pop(BuildContext context, [result]result为页面关闭时返回给上一个页面的数据
- 实例方法 Navigator.push(BuildContext context, Route route)等价于Navigator.of(context).push(Route route)
命名路由
- 路由表是一个哈希map Map<String, WidgetBuilder> routes;
- 注册路由表 ```dart initialRoute:”/”, //名为”/”的路由作为应用的home(首页)
//注册路由表 routes:{ “new_page”:(context) => NewRoute(), “/”:(context) => MyHomePage(title: ‘Flutter Demo Home Page’), //注册首页路由 }
* 通过路由名打开新路由页 `Navigator.pushNamed(context, "new_page")`
* 命名路由传递参数 (**!!!没搞懂用法,待实践**)
```dart
// 声明一个路由
routes{
    "new_page": (context) => EchoRoute()
}
// 路由定义
class EchoRoute extends Stateless {
    @override
    Widget build(BuildContext context) {
        // 获取路由参数
        var args = ModalRoute.of(context).settings.arguments;
        // 省略无关代码
    }
}
// 在打开路由页时传参“hi”
Navigator.of(context).pushNamed("new_page", arguments: "hi")
// ======================================
// 适配
MaterialApp(
  ... // 省略无关代码
  routes: {
   "tip2": (context){
     return TipRoute(text: ModalRoute.of(context).settings.arguments); // 如果TipRoute接受一个参数可以由调用页来传入
   },
 }, 
);
// 在打开路由页时传参"我是传参"
Navigator.of(context).pushNamed("tips2", arguments: "我是传参")
路由钩子
- onGenerateRoute在打开命名路由时,如果打开的命名路由没有在路由表中注册,则会调用;反之,不调用。由此可以用作钩子判断登录状态- MaterialApp( ... //省略无关代码 onGenerateRoute:(RouteSettings settings){ return MaterialPageRoute(builder: (context){ String routeName = settings.name; // 如果访问的路由页需要登录,但当前未登录,则直接返回登录页路由, // 引导用户登录;其它情况则正常打开路由。 } ); } );
- 可以通过onGenerateRoute做一些全局的路由跳转前置处理逻辑。
- ???疑问: 如何判断登录状态? 通过哪个参数?
包管理
包管理配置文件pubspec.yml
下载包
填好配置文件后点击android studio Packages get按钮 或者 终端flutter packages get
其他依赖方式
- 依赖本地包, 包名为pkg1dependecies: pkg1: path: ../../code/pkg1
- 依赖git, 包名为pkg2dependecies: pkg2: git: # case1 假定包位于存储库根目录 url: git://github.com/xxx/pkg2.git # case2 不是位于根目录 url: git://github.com/xxx/blahblahs.git path: blahblahs/pkg2
资源管理
调用图片文字资源之类的,很琐碎,使用时翻阅下apidoc或者这里
调试Flutter APP
Dart线程模型及异常捕获
Dart单线程模型

在事件循环中,当某个任务发生异常并没有被捕获时,程序并不会退出,而直接导致的结果是当前任务的后续代码就不会被执行了,也就是说一个任务中的异常是不会影响其它任务执行的。
Flutter异常捕获
??? 看的晕晕乎乎, 待实践..
void collectLog(String line){
    ... //收集日志
}
void reportErrorAndLog(FlutterErrorDetails details){
    ... //上报错误和日志逻辑
}
FlutterErrorDetails makeDetails(Object obj, StackTrace stack){
    ...// 构建错误信息
}
void main() {
  FlutterError.onError = (FlutterErrorDetails details) {
    reportErrorAndLog(details);
  };
  runZoned(
    () => runApp(MyApp()),
    zoneSpecification: ZoneSpecification(
      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
        collectLog(line); // 收集日志
      },
    ),
    onError: (Object obj, StackTrace stack) {
      var details = makeDetails(obj, stack);
      reportErrorAndLog(details);
    },
  );
}
 
      
留下评论