Flutter之ListView以及简单交互

我们按照官方的实例来写一个

《Flutter之ListView以及简单交互》
《Flutter之ListView以及简单交互》

第一步:先创建一个无状态的小部件类

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      //应用名       title: "Flutter Demo",
      //应用样式主题       theme: new ThemeData(primaryColor: Colors.white),
      //home内包装的是应用程序启动时默认展示的小部件       //创建一个脚手架,将小部件放在自己中心       home: new Scaffold(
        body: new Center(
          child: RandomWordsWidget(),
        ),
      ),
    );
  }
}

我们在build中初始化了一个MaterialApp对象,MaterialApp负责实现国际化(支持多种语言)、路由与导航(多屏幕之间转场)等功能。

第二步:创建一个有状态的小部件

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

第三步:创建一个随机生成单词小部件状态类

class RandomWordsState extends State {
    @override
    Widget build(BuildContext context) {
     //............     }
}

下面再RandomWordsState类中初始化三个变量

  ///单词列表   var wordList = <WordPair>[];

  ///收藏列表   var savedList = new Set<WordPair>();

  ///字体样式   var biggerFont = new TextStyle(fontSize: 18.0);

看到小部件状态类中重写了Widget build(BuildContext context) ,我们点击BuildContext进入源码中都能看到这个类的注释说明,就目前我个人认为基本上直接new Scaffold 初始化一个脚手架。

《Flutter之ListView以及简单交互》
《Flutter之ListView以及简单交互》

我们看到脚手架内参数的名称,那么我们现在初始化一个RandomWordsState状态的脚手架

 @override
  Widget build(BuildContext context) {
    //初始化一个含appbar的脚手架     return new Scaffold(
      appBar: new AppBar(
        //actionbar标题         title: new Text('Startup Name Generator'),
        //actionbar按钮操作         actions: <Widget>[
          new IconButton(
              //onPressed如果设置Null则按钮被禁用,设置其他则走对应的回调,界面跳转等等               icon: new Icon(Icons.list), onPressed: favoriteListActivity)
        ],
      ),
      //创建一个列表widget       body: buildWordList(),
    );
  }

第四步:先构建列表的一行

需要使用ListTile

Widget buildRow(WordPair wordPair) {
    var isCollection = savedList.contains(wordPair);
    return new ListTile(
      //标题       title: new Text(
        wordPair.asPascalCase,
        style: biggerFont,
      ),
      //标题后面显示的小部件       trailing: new Icon(
        //true的话显示实心❤️,false显示空❤️         isCollection ? Icons.favorite : Icons.favorite_border,
        color: isCollection ? Colors.red : null,
      ),
      onTap: () {
        //通知框架该对象的内部状态已经更改         setState(() {
          if (isCollection) {//将变化从收藏列表移除             savedList.remove(wordPair);
          } else {//将变化添加到收藏列表             savedList.add(wordPair);
          }
        });
      },
    );
  }

第五步:构建列表

Widget buildWordList() {
    return new ListView.builder(
        //四个方向的边距像素         padding: const EdgeInsets.all(16.0),
        itemBuilder: (context, i) {
          //如果是奇数返回分割线           if (i.isOdd) return new Divider();
          //偶数的话开始构建一行           final index = i ~/ 2;
          if (index >= wordList.length) {
            //无限滚动的列表数据无限增加             wordList.addAll(generateWordPairs().take(10));
          }
          return buildRow(wordList[index]);
        });
  }

最后一步:跳转到收藏列表

void favoriteListActivity() {
    Navigator.of(context).push(
      new MaterialPageRoute(
        builder: (context) {
          //返回一个列表ListTile,Iterable<Widget>可以直接用var或final代替           //这里为了便于读者阅读,先写成Iterable<Widget> 声明           //将items的内容设置给Adapter           Iterable<Widget> tileList = savedList.map(
            (pair) {
              //ListView的一行               return new ListTile(
                title: new Text(
                  pair.asPascalCase,
                  style: biggerFont,
                ),
              );
            },
          );
          //给Listview设置分隔线           Iterable<Widget> widgetList = ListTile
              .divideTiles(
                context: context,
                tiles: tileList,
              ).toList();

          return new Scaffold(
            appBar: new AppBar(
              title: new Text('Saved Suggestions'),
            ),
            //添加ListView控件             body: new ListView(children: widgetList),
          );
        },
      ),
    );
  }

路由导航跳转,后面的文章会介绍到,先大概了解下。

    原文作者:蒙娜lisa
    原文地址: https://zhuanlan.zhihu.com/p/37974837
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞