flutter学习笔记:第一个APP应用

导读:本篇文章讲解 flutter学习笔记:第一个APP应用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

flutter学习笔记

引入第三方包

打开 pubspec.yaml,引入 english_words 这个包。

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^0.1.2
  english_words: ^3.1.0

点击上方的 “Packages get” 以加载引入的包,或者在终端执行命令

flutter packages get`

也是可以的。

添加一个 Stateful widget

Stateless widgets 是不可变的,所有属性都是 final 的。MyApp 本身就是一个 Stateless widget,实现了 build 方法。

Stateful widgets 维持着整个生命周期中可变的状态。实现一个 stateful widget 需要至少两个类:State 类和一个创建 State 实例的 StatefulWidget。StatefulWidget 本身不可变,但是 State 类在 widget 生命周期中一直存留。

1.添加 RandomWordsState。

大部分代码会在这个类里,它是一个 State,它为 RandomWords widget 保存维持状态。这个例子里它的作用是:

  • 保存生成的单词对,随着用户滑动而无限增长
  • 用户通过点击列表的心形图标来添加或移除喜欢的单词对
class RandomWordsState extends State<RandomWords> {
  // TODO Add build() method
}

2.添加 stateful 类型的 RandomWords widget,在 main.dart 中,MyApp 类外的任何地方定义都可以。主要作用是创建 State。

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

3.实现 build 方法

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

build 方法返回一个 Widget,而 Text 本身是 StatelessWidget 的子类。

4.使用 RandomWords 这个 Widget

将 MyApp 中 body 里的

child: Text(wordPair.asPascalCase),

修改成

child: RandomWords(),

RandomWords 是一个 stateful widget,它通过 createState 创建了一个 RandomWordsState,这个 State 来为这个 Widget 保存状态,State 本身通过 build 返回了一个 Text
创建无限滚动的列表
RandomWordsState 中创建一个变量 _suggestions,用于保存单词对,

在 Dart 语言中,_ 开头表示私有权限。

再创建 _biggerFont 使文字变大

class RandomWordsState extends State<RandomWords> {
  final _suggestions = <WordPair>[]; // 私有变量保存单词对

  final _biggerFont = const TextStyle(fontSize: 18.0);
  // ...
}

RandomWordsState 中创建私有函数 _buildSuggestions(),用于创建 ListView 并展示单词对。

ListView 类提供了一个 builder 属性——itemBuilder,它是一个工厂构建者,且通过匿名函数提供回调功能,这个匿名函数有两个参数,BuildContext 和行迭代器,迭代器从 0 开始且每次调用方法时递增。

class RandomWordsState extends State<RandomWords> {
  // ...
  Widget _buildSuggestions() {
    return ListView.builder(
      padding: const EdgeInsets.all(16.0),
      itemBuilder: (context, i) {
        // 奇数行,返回 1 像素的分割线,相比于 Android,这里分割线本身也是一个 Item,也占了一个 position
        if (i.isOdd) return Divider();

        // 整除 2,由于奇数行是分割线,所以能执行到这里时,i 的值为 0, 2, 4, ...
        final index = i ~/ 2;
        // _suggestions 里的单词都被用过了
        if (index >= _suggestions.length) {
          // 再添加 10 条进去
          _suggestions.addAll(generateWordPairs().take(10));
        }
        // 使用单词对创建一个 ListTile
        return _buildRow(_suggestions[index]);
      });
  }
}

RandomWordsState 中添加 _buildRow 函数

Widget _buildRow(WordPair pair) {
  return ListTile(
    title: Text(
      pair.asPascalCase,
      style: _biggerFont, // 使用定义的文字样式控制大小
    ),
  );
}

修改 RandomWordsStatebuild 方法,使用 _buildSuggestions

class RandomWordsState extends State<RandomWords> {
  // ...
  @override
  Widget build(BuildContext context) {
    return Scaffold (
      appBar: AppBar(
        title: Text('Startup Name Generator'),
      ),
      body: _buildSuggestions(),
    );
  }
}

修改 MyAppbuild 方法

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Startup Name Generator',
      home: RandomWords(),
    );
  }
}

这样整个页面的状态都转移到了 RandomWords 这个 Stateful widget 里,它最后通过 Statebuild 方法来获取显示的 Widget,而这个 Widgetbody 调用 _buildSuggestions 方法返回 ListView

效果:

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/63431.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!