• Flutter 初体验


    在 Flutter 中,几乎所有的东西都是 widget,例如:布局模型、图像、图标、文本、排列、限制、对齐、行、列、网格等

    Flutter 布局的核心机制就是 widgets,可以通过组合 widgets 来构建更复杂的 widgets 来创建布局
     
    runApp() 函数会持有传入的 Widget,并且使它成为 widget 树中的根节点。在上例中,Widget 树有两个 widgets, Center widget 及其子 widget —— Text widget。框架会强制让根 widget 铺满整个屏幕,也就是说“Hello Flutter”会在屏幕上居中显示

    Flutter 从 React 中吸取灵感,通过现代化框架创建出精美的组件。它的核心思想是用 widgets 来构建 UI 界面,widgets 描述了在当前的配置和状态下视图所应该呈现的样子。当 widget 的状态改变时,它会重新构建其描述(展示的UI),框架则会对比前后变化的不同,以确定底层渲染树从一个状态转换到下一个状态所需的最小更改

    widget 要点如下:
    (1)、widget 是用于构建 UI 的类
    (2)、widget 可以用于布局和展示 UI 元素
    (3)、通过组合简单的 widgets 来构建复杂的 widgets
     
    在 pubspec.yaml 文件的 flutter 部分加入 uses-material-design: true 就可以使用 Material 的特性。Material Design 是谷歌推出的前端 UI 解决方案,是一种移动端和网页端通用的视觉设计语言

    Scaffold 是 Material Design 提供的一个 widget,它提供了默认的导航栏、标题和包含主屏幕 widget 树的body属性
    import 'package:flutter/material.dart';
    
    void main() {
      runApp(const MyApp());
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            title: 'Welcome to Flutter',
            home: Scaffold(
              appBar: AppBar(
                title: const Text('Flutter Title'),
                backgroundColor: Colors.purple,
                leading: const Icon(Icons.menu),
                actions: const [Icon(Icons.search), Icon(Icons.more)],
              ),
              body: const Center(
                child: Text(
                  'Hello Flutter',
                  style: TextStyle(
                    fontSize: 50,
                  ),
                ),
              ),
              bottomNavigationBar: BottomNavigationBar(
                  type: BottomNavigationBarType.fixed,
                  backgroundColor: Colors.purple,
                  selectedItemColor: Colors.white,
                  unselectedItemColor: Colors.white.withOpacity(.60),
                  selectedFontSize: 16,
                  unselectedFontSize: 16,
                  items: const [
                    BottomNavigationBarItem(
                      icon: Icon(Icons.favorite),
                      label: 'Favorities',
                    ),
                    BottomNavigationBarItem(
                      icon: Icon(Icons.music_note),
                      label: 'Music',
                    ),
                    BottomNavigationBarItem(
                      icon: Icon(Icons.location_on),
                      label: 'Places',
                    ),
                    BottomNavigationBarItem(
                      icon: Icon(Icons.library_books),
                      label: 'News',
                    )
                  ]),
            )
            // home: Home(),
            );
      }
    }

    MaterialApp 部分属性
      title(任务管理器中的标题)-- String 类型
      home(主内容)-- Widget 组件
      debugShowCheckedModeBanner(是否显示左上角调试标记)-- bool 类型,默认值 true

    Scaffold 部分属性
      appBar(应用头部)-- AppBar 类型
      body(应用主体)-- Widget 组件
      floatingActionButton(右下角的浮动按钮)-- Widget 组件
      drawer(左侧抽屉菜单)-- Widget 组件
      endDrawer(右侧抽屉菜单)-- Widget 组件

    使用外部 package
     
    方法1:在 pubspec.yaml 配置文件中找到 dependencies 或 dev_dependencies 选项,添加包名并指定版本号
    english_words: ^4.0.0
    然后,执行 flutter pub get 指令将依赖包按照到项目中。安装成功后可以在 pubspec.lock 文件中,可以查看安装包的名称和版本信息
    方法2:直接执行 flutter pub add http 指令

    示例中使用安装好的 english_words包,每次单击热重载或保存项目时,都会在正在运行的应用程序中随机选择不同的单词对
    import 'package:flutter/material.dart';
    import 'package:english_words/english_words.dart';
    
    class Home extends StatelessWidget {
      const Home({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        final wordPair = WordPair.random();
        return MaterialApp(
            title: 'Welcome to Flutter',
            home: Scaffold(
                appBar: AppBar(
                  title: const Text('Package Demo'),
                ),
                body: Center(
                  child: Text(wordPair.asPascalCase),
                )));
      }
    }
    在写应用的过程中,取决于是否需要管理状态,通常会创建一个新的组件继承 StatelessWidget 或 StatefulWidget。Widget 的主要工作是实现 build() 方法,该方法会实例化和返回一个 widget 并让它显示出来
    无状态组件(StatelessWidget)
    无状态的 widget 是不可变的,意味着它们的属性不能改变,所有的值都是 final
    有状态组件(StatefulWidget)
    有状态的 widget 也是不可变的,但其持有的状态可能在 widget 生命周期中发生变化,实现一个有状态的 widget 至少需要两个类:
    (1)、一个 StatefulWidget 类
    (2)、一个 State 类
    import 'package:flutter/material.dart';
    import 'package:english_words/english_words.dart';
    
    class Home extends StatelessWidget {
      const Home({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            title: 'Welcome to Flutter',
            home: Scaffold(
                appBar: AppBar(
                  title: const Text('Package Demo'),
                ),
                body: const Center(
                  child: RandomWords(),
                )));
      }
    }
    
    class RandomWords extends StatefulWidget {
      const RandomWords({Key? key}) : super(key: key);
    
      @override
      State<RandomWords> createState() => _RandomWordsState();
    }
    
    class _RandomWordsState extends State<RandomWords> {
      @override
      Widget build(BuildContext context) {
        final wordPair = WordPair.random();
        return Text(wordPair.asPascalCase);
      }
    }
     
    示例说明:
    (1)、在 vscode 中输入 sf,编辑器会自动创建一个 Stateful widget 和它自己的状态类
    (2)、输入 RandomWords 作为有状态 widget 的名称,其状态类会自动更名为 _RandomWordsState。RandomWords widget 的主要作用就是创建其对应的 State 类,默认情况下,State 类的名称带有下划线前缀用于增强隐私性
    (3)、把 RandomWords 内嵌到已有的无状态类 Home widget
    重启应用,应用像之前一样运行,每次热重载或保存应用程序时都会显示一个单词对
     
     
     
  • 相关阅读:
    Tomcat
    mybatis xml参数传递详解
    windows zookeeper集群
    @RequestParam和@RequestBody区别
    nginx学习
    先冒泡,再使用vector
    有a,b,c,d 4个球,分别出现的概率是10%,20%,30%,40%,要求编写RunDemo,每调用一次函数RunDemo,就按上面的概率出现球。
    字符串右移
    编写程序输入实现123->321
    计算机网络(一)
  • 原文地址:https://www.cnblogs.com/rogerwu/p/16221532.html
Copyright © 2020-2023  润新知