Flutter控件——常用控件:StatelessWidget和Context

Posted wzj_what_why_how

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter控件——常用控件:StatelessWidget和Context相关的知识,希望对你有一定的参考价值。

StatelessWidget和Context

StatelessWidget

  • StatelessWidget相对比较简单,它继承自widget类,重写了createElement()方法:

      @override
      StatelessElement createElement() => StatelessElement(this);
    
  • StatelessWidget用于不需要维护状态的场景,它通常在build方法中通过嵌套其它 widget 来构建UI,在构建过程中会递归的构建其嵌套的 widget。

例子

class Echo extends StatelessWidget  
  const Echo(
    Key? key,
    required this.text,
    this.backgroundColor = Colors.grey, //默认为灰色
  ):super(key:key);

  final String text;
  final Color backgroundColor;

  @override
  Widget build(BuildContext context) 
    return Center(
      child: Container(
        color: backgroundColor,
        child: Text(text),
      ),
    );
  

上面的代码,实现了一个显示字符串的Echo widget 。

  • 按照惯例,widget 的构造函数参数应使用命名参数,命名参数中的必需要传的参数要添加required关键字,这样有利于静态代码分析器进行检查
  • 在继承 widget 时,第一个参数通常应该是Key。另外,如果 widget 需要接收子 widget ,那么child或children参数通常应被放在参数列表的最后。
  • 同样是按照惯例, widget 的属性应尽可能的被声明为final,防止被意外改变。

然后我们可以通过如下方式使用它:

 Widget build(BuildContext context) 
  return Echo(text: "hello world");


Context

  • build方法有一个context参数,它是BuildContext类的一个实例,表示当前 widget 在 widget 树中的上下文,
  • 每一个 widget 都会对应一个 context 对象(因为每一个 widget 都是 widget 树上的一个节点)。
  • 实际上,context是当前 widget 在 widget 树中位置中执行”相关操作“的一个句柄(handle),
  • 比如它提供了从当前 widget 开始向上遍历 widget 树以及按照 widget 类型查找父级 widget 的方法。

下面是在子树中获取父级 widget 的一个示例:

class ContextRoute extends StatelessWidget  
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text("Context测试"),
      ),
      body: Container(
        child: Builder(builder: (context) 
          // 在 widget 树中向上查找最近的父级`Scaffold`  widget
          Scaffold scaffold = context.findAncestorWidgetOfExactType<Scaffold>();
          // 直接返回 AppBar的title, 此处实际上是Text("Context测试")
          return (scaffold.appBar as AppBar).title;
        ),
      ),
    );
  

以上是关于Flutter控件——常用控件:StatelessWidget和Context的主要内容,如果未能解决你的问题,请参考以下文章

Flutter控件——常用控件:StatelessWidget和Context

Flutter控件——常用控件:Text

Flutter控件——常用控件:GridView

Flutter控件——常用控件:GridView

Flutter控件——常用控件:单选开关和复选框

Flutter控件——常用控件:ListView