从零开始写第一个Flutter app(三)——有状态的部件StatefulWidget

目录

StatefulWidget简介

StatelessWidget是不变的,他的所有属性的值都是不变的。

而StatefulWidget表示的是有状态的部件,它里面的属性是可变的。

要实现一个有状态的控件其实很简单,只需两两个类

  1. StatefulDidget:继承StatefulDidget类,然后实现createState()方法,返回一个State类的实例
  2. State:由StatefulDidget返回,继承State类,实现build()方法返回具体的控件,控件的状态是可变的。

实现

接下来我们把上节课的例子改成StatelessWidget实现

这里实现两个类:

  • RandomWords继承StatelessWidget
  • RandomWordsState继承State

首先先看下RandomWords的代码,代码很简单,继承RandomWords类,然后实现createState()方法,返回一个State实例,也就是我们下面要实现的RandomWordsState类

class RandomWords extends StatefulWidget {
  @override
  RandomWordsState createState() => RandomWordsState();
}

接下来看下RandomWordsState的具体实现,代码也是很简单,继承了State类,然后实现build()方法,返回一个Text控件,控件的内容是由WordPair生成的随机英文单词对

class RandomWordsState extends State<RandomWords> {
  @override
  Widget build(BuildContext context) {
    final WordPair wordPair = WordPair.random();
    return Text(wordPair.asPascalCase);
  }
}

最后看下MyApp修改后的内容,其实改动的地方就是把原来body中的Text改成我们自定义的有状态控件RandomWords

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final WordPair wordPair = WordPair.random();
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Welcome to Flutter'),
        ),
        body: Center(
          //child: Text(wordPair.asPascalCase), // 原来的这句话去掉 
          child: RandomWords(),                 // 替换成这句话
        ),
      ),
    );
  }
}

运行结果和上一节是一样的

本节最终的lib/main.dart文件内容如下

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Welcome to Flutter'),
        ),
        body: Center(
          child: RandomWords(),
        ),
      ),
    );
  }
}

// #docregion RandomWordsState, RWS-class-only
class RandomWordsState extends State<RandomWords> {
  // #enddocregion RWS-class-only
  @override
  Widget build(BuildContext context) {
    final wordPair = WordPair.random();
    return Text(wordPair.asPascalCase);
  }
// #docregion RWS-class-only
}
// #enddocregion RandomWordsState, RWS-class-only

// #docregion RandomWords
class RandomWords extends StatefulWidget {
  @override
  RandomWordsState createState() => new RandomWordsState();
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值