• 写一个flutter程序—记录


    目录

    使用外部package

    添加一个Stateful widget


    Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的,可以用一套代码同时构建Android和iOS应用,性能可以达到原生应用一样的性能。

    一句话总结就是:Flutter是一个跨平台、高性能的移动UI框架

    这一部分我们写一个简单应用
    功能是,为一个创业公司生成建议的公司名称。
    用户可以选择和取消选择的名称,保存喜欢的名称。
    该代码一次生成十个名称
    用户滚动时,生成新一批名称。

    着重体验以下几点

    1. Flutter如何在Android、iOS、桌面和web里自动适应不同的UI体系
    2. Flutter工程/项目的基本结构
    3. 查找和使用packages来扩展功能
    4. 使用热重载(hot reload)加快开发周期
    5. 如何实现有状态的widget
    6. 如何创建一个无限的、延迟加载的列表

    替换掉lib/main.dart中的内容

    1. import 'package:flutter/material.dart';
    2. void main(List<String> args) {
    3. runApp(const MyApp());
    4. }
    5. class MyApp extends StatelessWidget{
    6. const MyApp({super.key});
    7. @override
    8. Widget build(BuildContext context){
    9. return MaterialApp(
    10. title: 'Welcome to Flutter',
    11. home: Scaffold(
    12. appBar: AppBar(
    13. title: const Text('Welcome to Flutter--appBar'),
    14. ),
    15. body: const Center(
    16. child: Text('Hello World'),
    17. ),
    18. ),
    19. );
    20. }
    21. }

    运行效果:

     

    使用外部package

    在这一步我们初步了解项目目录中的pubspec.yaml文件的作用
    pubspec.yaml管理着Flutter工程中所有的资源和依赖

    1. 通过命令行的方式将包 english_words这个package加入到你的工程,在控制台会输出以下信息

     

    依赖关系的获取会自动生成pubspec.lock文件,包含所有加入项目的package和版本号信息

    更新main.dart的代码

    1. import 'package:flutter/material.dart';
    2. import 'package:english_words/english_words.dart';
    3. void main(List<String> args) {
    4. runApp(const MyApp());
    5. }
    6. class MyApp extends StatelessWidget{
    7. const MyApp({super.key});
    8. @override
    9. Widget build(BuildContext context){
    10. final wordPair = WordPair.random();
    11. return MaterialApp(
    12. title: 'Welcome to Flutter',
    13. home: Scaffold(
    14. appBar: AppBar(
    15. title: const Text('Welcome to Flutter--appBar'),
    16. ),
    17. body: Center(
    18. child: Text(wordPair.asPascalCase),
    19. ),
    20. ),
    21. );
    22. }
    23. }

    如果没有关闭运行程序,直接进行热重载,关闭程序的,重新运行
    效果如图

     

    每次热重载都能看见程序中间的单词改变

    添加一个Stateful widget

    状态的widgets是不可变的,这意味着他们的属性是不能改变的--所有的值都是final
    Dart中的关键字 final有什么作用?
    状态的widgets也是不可变的,但其持有的状态可能在widget生命周期中发生变化,实现一个有状态的widget至少需要两个类

    1. 一个StatefulWidget类
    2. 一个State类,StatefulWidget类本身是不变的,但State类在widget生命周期中始终存在
      在这一步,你将添加一个有状态的widget---RandomWords,它会创建自己的状态类--- _RandomWordState,然后你需要将RandomWords内嵌到
      已有的无状态MyApp Widget
      也就是说,想要一个有状态变化的widget需要两个类1.StatefulWidget类---状态不变2.一个State类--状态类
      然后只需要将有状态的widget内嵌到无状态的MyApp widget中,就可以体现出状态的改变
      修改lib/main.dart
    1. import 'package:flutter/material.dart';
    2. import 'package:english_words/english_words.dart';
    3. void main(List<String> args) {
    4. runApp(const MyApp());
    5. }
    6. class MyApp extends StatelessWidget{
    7. const MyApp({super.key});
    8. @override
    9. Widget build(BuildContext context){
    10. return MaterialApp(
    11. title: 'Startup Name Generator',
    12. home: Scaffold(
    13. appBar: AppBar(
    14. title: const Text('Startup Name Generator'),
    15. ),
    16. body: Center(
    17. child: RandomWords(),
    18. ),
    19. ),
    20. );
    21. }
    22. }
    23. class RandomWords extends StatefulWidget {
    24. const RandomWords({super.key});
    25. @override
    26. State<RandomWords> createState() => _RandomWordsState();
    27. }
    28. class _RandomWordsState extends State {
    29. final _suggesttions = <WordPair>[]; //保存建议的单词对
    30. final _biggerFont = const TextStyle(fontSize: 18);
    31. @override
    32. Widget build(BuildContext context) {
    33. return ListView.builder(
    34. padding: const EdgeInsets.all(16.0),
    35. itemBuilder: (context,i) {
    36. if(i.isOdd) return const Divider();
    37. final index = i~/2;
    38. if(index >= _suggesttions.length){
    39. _suggesttions.addAll(generateWordPairs().take(10));
    40. }
    41. return ListTile(
    42. title: Text(
    43. _suggesttions[index].asPascalCase,
    44. style: _biggerFont,
    45. ),
    46. );
    47. },
    48. );
    49. }
    50. }

     然后还有一个难点就是需要体会Dart的语法,类似于匿名函数的写法
    Widget是Flutter里的核心类,在Flutter中最核心的是用widgets构建UI界面
    widgets是描述一个UI元素的长相及当前的配置与状态。
    当widgets的状态改变后,widgets将重构他的描述,框架会与前一个描述做比对,对渲染树从前一个状态到当前的状态做出的最小的改变。

  • 相关阅读:
    Javascript知识【JS变量和运算符】
    计算机考研计算机网络题库
    深入理解Mysql事务隔离级别与锁机制
    C++泛型编程
    一文搞懂云原生架构
    微服务治理之道:构建可伸缩和高可用的系统
    PostgreSQL的学习心得和知识总结(一百一十一)|内核级自上而下完美实现PostgreSQL数据库 日志格式tsvlog 的实现方案
    CSS栅格布局(Grid)
    [Gcexcel]GrapeCity Documents Excel for Java 5.2.2
    网络请求库axios使用详解-简单封装
  • 原文地址:https://blog.csdn.net/m0_57781768/article/details/128175255