flutter:第一个flutter&Widget的使用 (二)

简介: 本文介绍了Flutter框架下的基本组件及其用法,包括简单的 Stateless Widget 如文本和按钮,以及更复杂的 StatefulWidget 示例。详细解释了如何使用 `context` 获取祖先小部件的信息,并展示了 `MaterialApp` 的属性及用途。此外,还探讨了 `StatefulWidget` 与 `StatelessWidget` 的区别,以及 `AppBar` 的常见属性配置方法。适合Flutter初学者参考学习。

前言

在Flutter开发中,掌握基本组件的使用是构建高效应用的关键。本文将深入探讨Flutter框架下的核心组件及其用法,特别是简单的Stateless Widget,如文本和按钮,以及更复杂的StatefulWidget示例。

第一个flutter

widget

import 'package:flutter/material.dart';
class Echo extends StatelessWidget{
  const Echo ({super.key});
  @override
  Widget build(BuildContext context){
    return Center(
      child: Container(
        //背景颜色
        color: Colors.blue,
        child: const Text(
            'hello flutter',
          //left to right
          textDirection: TextDirection.ltr,
        ),
      ),
    );
  }
}
void main(List<String> args){
  runApp(const Echo());
}

context

import 'package:flutter/material.dart';
class ContextRoute extends StatelessWidget {
  const ContextRoute({super.key});
// scaffold   脚手架
  @override
  Widget build(BuildContext context) {
  //  Scaffold  find  Widget  什么的
  Scaffold scaffold=  context.findAncestorWidgetOfExactType<Scaffold>()!;
    // 得到appBar  里面的内容   并返回
    return   (scaffold.appBar as AppBar).title!;
  }
}
  void main(List<String> args) {
    runApp(MaterialApp(
      title: "my app",
      home: Scaffold(
        appBar: AppBar(
          title: const Text("myApp"),
        ),
        //设置body 的类容为 ContextRoute 的返回值
        body: const ContextRoute(),
      ),
    ));
  }

StatefulWidget

import 'package:flutter/material.dart';
class CounterWidget extends StatefulWidget{
  const CounterWidget({super.key});
  @override
  State<StatefulWidget> createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget>{
  int _counter=0;
  @override
  Widget build(BuildContext context) {
  return const MaterialApp(
    title: "Myapp",
    home: Scaffold(
      body: Center(
        child: TextButton(
            onPressed: () =>setState(()=> _counter++),
            child: Text('0',
            style: const TextStyle(
              fontSize: 28,
            ),),
        ),
      ),
    ),
  );
  }
}
int count(var a){
  return a++;
}
void main(List<String>list){
  runApp(const CounterWidget());
}
import 'package:flutter/material.dart';
class Echo extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
return _Echo();
  }
}
class _Echo extends State <Echo>{
    @override
    Widget build(BuildContext context){
      return Scaffold(
          appBar: AppBar(
            title:const Text( "i am the title"),
          ),
          body:const Center(
            child: Text("i am the body"),
          ),
          floatingActionButton: FloatingActionButton(
          child: const Icon(Icons.add),onPressed: (){
            print("hello,world");
          },
      ),
      );
    }
  }
void main(List<String> args){
runApp(MaterialApp(
  title: 'hello',
  home: Echo(),
));
}

Widget

MaterialApp

装饰app

ThemeData 有的属性,
ThemeData是Flutter UI框架中的一个类,用于定义应用程序的主题样式。它包含以下属性:
appBarTheme:用于自定义AppBar(导航栏)的样式。
backgroundColor:用于定义应用程序的背景色。
bottomAppBarColor:用于定义底部导航栏的背景色。
brightness:用于定义状态栏的明亮模式,可以是Brightness.light或Brightness.dark。
buttonColor:用于定义按钮的背景色。
cardColor:用于定义卡片(Card)的背景色。
dialogBackgroundColor:用于定义对话框的背景色。
disabledColor:用于定义被禁用的组件的颜色。
dividerColor:用于定义分割线的颜色。
errorColor:用于定义错误信息的颜色。
focusColor:用于定义组件获得焦点时的颜色。
fontFamily:用于定义应用程序中的默认字体。
iconTheme:用于自定义图标的样式。
primaryColor:用于定义应用程序的主要颜色。
scaffoldBackgroundColor:用于定义Scaffold(脚手架)的背景色。
secondaryHeaderColor:用于定义辅助提示的背景色。
textTheme:用于自定义文本的样式。
这些属性可以根据需求进行自定义配置,以创建符合应用程序设计风格的主题样式。
在网上搜索更佳答案

container

box

return Center(
      child: Container(
        // 配置文字 居中
        alignment: Alignment.center,
        width: 100,
        height: 100,
        // 装修盒子
        decoration: BoxDecoration(
            color: Colors.red,
            border: Border.all(color: Colors.grey),
            borderRadius: BorderRadius.circular(10),
            boxShadow: [
              BoxShadow(color: Colors.black, blurRadius: 10),
            ],
            //LinearGradient,RadialGradient
            gradient: LinearGradient(colors: [Colors.blue, Colors.yellow])),
              // 改变方向
        child: Text(
          'this is a box',
          style: TextStyle(color: Colors.white),
        ),
      ),
    );

button

return Center(
        child: Container(
          width: 200,
          height: 40,
          alignment: Alignment.center,
          margin: EdgeInsets.all(10),
          // margin: EdgeInsets.fromLTRB(left, top, right, bottom),
          decoration: BoxDecoration(
            // color: Color.fromRGBO(10, 10, 10, 1)
              color: Colors.blue,
              borderRadius: BorderRadius.circular(10)
          ),
          child: Text('button',style: TextStyle(
            color: Colors.white,
            fontSize: 22,
          ),),
        )
    );

动画

transform: Matrix4.translationValues(40, 0, 0),
        transform: Matrix4.rotationZ(0.2),

text

//改变文字样式
         overflow: TextOverflow.ellipsis,
           fontStyle:normal,italic


StatefulWidget和statelessWidget

StatefulWidget 和 StatelessWidget 是 Flutter 框架中的两个重要概念,用于构建用户界面。

  1. StatefulWidget(有状态的小部件): StatefulWidget 是表示有状态部件的类,其状态在生命周期中可以发生改变。要创建 StatefulWidget,需要定义一个继承自 StatefulWidget 的类,并为该类实现两个关键部分:
  • State:StatefulWidget 的状态。它维护和管理与该部件相关的数据,并根据需要在部件生命周期中更新。State 是一个独立的对象,它与 StatefulWidget 一起创建,并且可以通过调用 setState() 方法来触发状态更新。
  • build() 方法:在 State 中,build() 方法用于构建并返回表示该部件的用户界面。该方法会在初始化和每次状态更新时被调用。
  1. StatelessWidget(无状态的小部件): StatelessWidget 表示没有可变状态的部件。一旦创建,它们的属性(如文本、样式)就不会发生更改。要创建 StatelessWidget,需要定义一个继承自 StatelessWidget 的类,并实现其中一个关键部分:
  • build() 方法:通过 build() 方法来构建并返回表示该部件的用户界面。与 StatefulWidget 不同,StatelessWidget 没有可变状态,因此在构建后其外观不会发生变化。

总之,StatefulWidget 用于构建具有可变状态的部件,而 StatelessWidget 用于构建外观稳定且没有可变状态的部件。在 Flutter 应用程序中,通常根据需要选择使用哪种部件,以实现交互性和外观的要求。


appBar

 

AppBar 有哪些属性

AppBar是Flutter中的一个小部件,用于创建应用程序的导航栏。它具有以下常用属性:

backgroundColor:用于定义AppBar的背景颜色。

title:用于设置AppBar的标题文本,可以是一个文本小部件(例如Text),也可以是一个图标小部件(例如Icon)。

actions:用于在AppBar的右侧添加操作按钮,可以是一个包含多个小部件的列表。

leading:用于设置AppBar的左侧导航按钮,通常是一个图标按钮(例如IconButton)。

centerTitle:用于定义标题是否位于AppBar的中间,默认为false,即标题位于左侧。

elevation:用于定义AppBar的阴影高度,默认为4.0。

brightness:用于定义状态栏的明亮模式,可以是Brightness.light或Brightness.dark。

iconTheme:用于自定义AppBar中图标的样式,如颜色、大小等。

textTheme:用于自定义AppBar中文本的样式,如颜色、大小等。

toolbarHeight:用于定义AppBar的高度,默认根据系统平台确定。

这些属性可以根据需求进行自定义配置,以创建符合应用程序设计风格的AppBar。

相关文章
|
28天前
深入理解Flutter鸿蒙next版本 中的Widget继承:使用extends获取数据与父类约束
本文详细介绍了Flutter中如何通过继承其他Widget来创建自定义组件。首先解释了Widget继承的基本概念,包括StatelessWidget和StatefulWidget的区别。接着通过具体示例展示了如何继承StatelessWidget和StatefulWidget,并在子类中访问父类的build方法和状态。最后,结合多个自定义Widget展示了如何在实际应用中灵活使用继承和组合来构建复杂的UI。
74 8
|
26天前
|
容器
flutter&鸿蒙next 使用 InheritedWidget 实现跨 Widget 传递状态
在 Flutter 中,状态管理至关重要。本文详细介绍了如何使用 InheritedWidget 实现跨 Widget 的状态传递。InheritedWidget 允许数据在 Widget 树中向下传递,适用于多层嵌套的场景。通过一个简单的计数器示例,展示了如何创建和使用 InheritedWidget,包括其基础概念、工作原理及代码实现。虽然 InheritedWidget 较底层,但它是许多高级状态管理解决方案的基础。
95 2
|
26天前
|
Dart JavaScript 前端开发
Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
Flutter 是 Google 开发的开源 UI 框架,用于快速构建高性能的移动、Web 和桌面应用。Flutter 通过 Widget 构建 UI,每个 UI 元素都是 Widget,包括文本、按钮、图片等。Widget 不仅描述外观,还描述行为,是不可变的。常见的 Widget 包括结构型(Container、Column、Row)、呈现型(Text、Image)、交互型(ElevatedButton)和状态管理型(StatefulWidget)。Flutter 与鸿蒙 Next 在组件化架构、开发语言、布局系统、性能和跨平台支持方面各有优势
70 0
|
5月前
Flutter-底部弹出框(Widget层级)
文章描述了如何在Flutter中使用DraggableScrollableSheet创建一个底部弹出框,同时保持其可手势滑动关闭。作者遇到问题并提出对原控件进行扩展,以支持头部和列表布局的滑动关闭功能。
189 0
|
6月前
Flutter StreamBuilder 实现局部刷新 Widget
Flutter StreamBuilder 实现局部刷新 Widget
47 0
|
7月前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
7月前
|
开发框架 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
【4月更文挑战第30天】探索Flutter的自定义Widget与渲染流程。自定义Widget是实现复杂UI设计的关键,优点在于个性化设计、功能扩展和代码复用,但也面临性能优化和复杂性管理的挑战。创建步骤包括设计结构、定义Widget类、实现构建逻辑和处理交互。Flutter渲染流程涉及渲染对象树、布局、绘制和合成阶段。实践案例展示如何创建带渐变背景和阴影的自定义按钮。了解这些知识能提升应用体验并应对开发挑战。查阅官方文档以深入学习。
82 0
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
|
7月前
|
JavaScript 前端开发 开发者
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理
【4月更文挑战第30天】本文探讨了Flutter的Widget和状态管理。Widget是Flutter构建UI的基础,分为有状态和无状态两种。状态管理确保UI随应用状态变化更新,影响应用性能和可维护性。文章介绍了`setState`、`Provider`、`Riverpod`、`Bloc`和`Redux`等状态管理方法,并通过计数器应用展示了其实现。选择合适的状态管理策略对高效开发至关重要。
96 0
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理
|
7月前
|
编解码 算法 开发者
Flutter的布局系统:深入探索布局Widget与布局原则
【4月更文挑战第26天】Flutter布局系统详解,涵盖布局Widget(Row/Column、Stack、GridView/ListView、CustomSingleChildLayout)和布局原则(弹性布局、约束优先、流式布局、简洁明了)。文章旨在帮助开发者理解并运用Flutter的布局系统,创建适应性强、用户体验佳的界面。通过选择合适的布局Widget和遵循原则,可实现复杂且高效的UI设计。
|
7月前
|
前端开发 开发者 UED
Flutter的自定义Painter:深入探索自定义绘制Widget的技术实现
【4月更文挑战第26天】Flutter的自定义Painter允许开发者根据需求绘制独特UI,通过继承`CustomPaint`类和重写`paint`方法实现。在`paint`中使用`Canvas`绘制图形、路径等。创建自定义Painter类后,将其作为`CustomPaint` Widget的`painter`属性使用。此技术可实现自定义形状、渐变、动画等复杂效果,提升应用视觉体验。随着Flutter的进化,自定义Painter将提供更丰富的功能。