}

class MyApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(
  title: 'Flutter Demo',
  navigatorKey: NavigatorKeyUtils.navigatorKey,
  theme: ThemeData(
    primarySwatch: Colors.blue,
    visualDensity: VisualDensity.adaptivePlatformDensity,
  ),
  home: MyHomePage(title: 'Flutter Demo Home Page'),
  routes: <String, WidgetBuilder>{
    '/MyHomePage': (BuildContext context) {
      return MyHomePage();
    },
    '/TwoPage': (BuildContext context) {
      return TwoPage();
    },
  },
);

}

}

class MyHomePage extends StatefulWidget {

MyHomePage({Key key, this.title}) : super(key: key);

final String title;

@override

_MyHomePageState createState() => _MyHomePageState();

}

class _MyHomePageState extends State {

@override

Widget build(BuildContext context) {

return Scaffold(
  appBar: AppBar(
    title: Text('data'),
  ),
  body: Center(
    child: GestureDetector(
      onTap: () {
        NavigatorKeyUtils.navigatorKey.currentState.pushNamed('/TwoPage');
      },
      child: Container(
        color: Colors.blue,
        child: Text('点击跳转'),
      ),
    ),
  ),
  //child: Text.rich(TextSpan(text: 'final InlineSpan textSpan / The text to display as a [InlineSpan]')),
);

}

}

class TwoPage extends StatefulWidget {

TwoPage({Key key, this.title}) : super(key: key);

final String title;

@override

_TwoPageState createState() => _TwoPageState();

}

class _TwoPageState extends State {

@override

Widget build(BuildContext context) {

return Scaffold(
  appBar: AppBar(
    title: Text('data'),
  ),
  body: Center(
    child: Container(
      width: 200.0,
      //height: 100.0,
      color: Colors.blue,
      child: Text(
        'TwoPage',
        textDirection: TextDirection.ltr,
        overflow: TextOverflow.visible,
        textScaleFactor: 1.0,
        textWidthBasis: TextWidthBasis.longestLine,
        textHeightBehavior: TextHeightBehavior(
            applyHeightToFirstAscent: true, applyHeightToLastDescent: true),
      ),
    ),
  ),
  //child: Text.rich(TextSpan(text: 'final InlineSpan textSpan / The text to display as a [InlineSpan]')),
);

}

}

home

相当于一个应用程序的首页

routes

Map<String, WidgetBuilder> routes / Map集合

方便通过路由名称进行跳转到指定的路由(页面)

routes: <String, WidgetBuilder>{

    '/MyHomePage': (BuildContext context) {
      return MyHomePage();
    },
    '/TwoPage': (BuildContext context) {
      return TwoPage();
    },
  },

NavigatorKeyUtils.navigatorKey.currentState.pushNamed(‘/TwoPage’);

initialRoute

会覆盖应用程序首页(home)

void main() {

runApp(MyApp());

}

class MyApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(
  title: 'Flutter Demo',
  navigatorKey: NavigatorKeyUtils.navigatorKey,
  theme: ThemeData(
    primarySwatch: Colors.blue,
    visualDensity: VisualDensity.adaptivePlatformDensity,
  ),
  home: MyHomePage(title: 'Flutter Demo Home Page'),
  routes: <String, WidgetBuilder>{
    '/InitPage': (BuildContext context) {
      return InitPage();
    },
    '/MyHomePage': (BuildContext context) {
      return MyHomePage();
    },
    '/TwoPage': (BuildContext context) {
      return TwoPage();
    },
  },
  initialRoute: '/InitPage',
);

}

}

onGenerateRoute

生成路由,当你跳转的路由中不存在该该路由,那么就由生成路由代替

class MyApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(
    title: 'Flutter Demo',
    navigatorKey: NavigatorKeyUtils.navigatorKey,
    theme: ThemeData(
      primarySwatch: Colors.blue,
      visualDensity: VisualDensity.adaptivePlatformDensity,
    ),
    home: MyHomePage(title: 'Flutter Demo Home Page'),
    routes: <String, WidgetBuilder>{
      '/InitPage': (BuildContext context) {
        return InitPage();
      },
      '/MyHomePage': (BuildContext context) {
        return MyHomePage();
      },
      '/TwoPage': (BuildContext context) {
        return TwoPage();
      },
    },
    //initialRoute: '/InitPage',
    onGenerateRoute: (RouteSettings settings) {
      return new MaterialPageRoute<void>(
        settings: settings,
        builder: (BuildContext context) => InitPage(),
      );
    });

}

}

NavigatorKeyUtils.navigatorKey.currentState.pushNamed(‘/ThreePage’);

导航到路由名称:‘/ThreePage’ 不存在,那么将导航到路由InitPage

onUnknownRoute

效果跟onGenerateRoute一样

调用顺序为onGenerateRoute ==> onUnknownRoute

navigatorObservers

导航路由观察,可以监听到关闭的Page和打开的Page。相关函数有:

didPush()、didPop()、didRemove()、didReplace()、didStartUserGesture()、didStopUserGesture()
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结语

  • 现在随着短视频,抖音,快手的流行NDK模块开发也显得越发重要,需要这块人才的企业也越来越多,随之学习这块的人也变多了,音视频的开发,往往是比较难的,而这个比较难的技术就是NDK里面的技术。
  • 音视频/高清大图片/人工智能/直播/抖音等等这年与用户最紧密,与我们生活最相关的技术一直都在寻找最终的技术落地平台,以前是windows系统,而现在则是移动系统了,移动系统中又是以Android占比绝大部分为前提,所以AndroidNDK技术已经是我们必备技能了。
  • 要学习好NDK,其中的关于C/C++,jni,Linux基础都是需要学习的,除此之外,音视频的编解码技术,流媒体协议,ffmpeg这些都是音视频开发必备技能,而且
  • OpenCV/OpenGl/这些又是图像处理必备知识,下面这些我都是当年自己搜集的资料和做的一些图,因为当年我就感觉视频这块会是一个大的趋势。所以提前做了一些准备。现在拿出来分享给大家。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

技术一直都在寻找最终的技术落地平台,以前是windows系统,而现在则是移动系统了,移动系统中又是以Android占比绝大部分为前提,所以AndroidNDK技术已经是我们必备技能了。

  • 要学习好NDK,其中的关于C/C++,jni,Linux基础都是需要学习的,除此之外,音视频的编解码技术,流媒体协议,ffmpeg这些都是音视频开发必备技能,而且
  • OpenCV/OpenGl/这些又是图像处理必备知识,下面这些我都是当年自己搜集的资料和做的一些图,因为当年我就感觉视频这块会是一个大的趋势。所以提前做了一些准备。现在拿出来分享给大家。

[外链图片转存中…(img-6zOmO5np-1711816725776)]

[外链图片转存中…(img-KsggfxjY-1711816725776)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐