flutter第七篇:学习大地老师《Flutter仿小米商城实战》笔记1

TextField表示文本框。文本框默认只有底部边框,如果想变成四边形的框,需要利用其decoration属性,指定其值为InputDecoration实例,指定InputDecoration实例的border属性值为OutlineInputBorder实例。如果想要有placeholder,则需利用InputDecoration实例的hintText属性。如果想让文本框有初始值,则需要利用其controller属性,controller属性是个TextEditingController实例。在xxxState类中定义一个TextEditingController实例,在initState方法中实例化,在dispose中销毁。通过TextEditingController实例的text属性获取文本框里面的值。如果想让TextField与上下左右有点距离,可以用Padding包裹。

单选框用radio、radioListTile组件,复选框用checkbox、checkboxListTile组件。radio就是一个单选框,不包含框前面的文本,文本需要Text。 而radioListTile可以利用其title属性放文本。radioListTile独占一行,文本和复选框两边对齐。多个radioListTile放在一个Row中会报错。checkbox、checkboxListTile同理。

CircularProgressIndicator表示转圈圈的进度条,LinearProgressIndicator表示从左到右的横线进度条,可以利用color属性和backgroundColor属性设置已完成进度的颜色和未完成进度的颜色,利用value设置已完成进度的值。CupertinoActivityIndicator表示苹果专用的菊花形状的进度条,使用时需要引入cupertino.dart,可以利用radius设置菊花的半径,利用color设置菊花的颜色。

FutureBuilder是一个预置的StatefulWidget,可以用来监听Future的执行状态,实现当拉取远程数据时页面显示转圈圈进度条,拉到数据后展示数据的效果。

Center(
          child: FutureBuilder(
              future: loadData(),
              builder: (context, snapshot) {
                print(snapshot.connectionState);
                if (ConnectionState.done == snapshot.connectionState) {
                  if (snapshot.hasError) {
                    return Text("我是错误信息:${snapshot.error}");
                  } else {
                    return ListView(
                      children: snapshot.data!.map((e) {
                        return ListTile(title: Text("${e["title"]}"));
                      }).toList(),
                    );
                  }
                } else {
                  return const CircularProgressIndicator();
                }
              }))

上例中,loadData()是一个用async修饰、返回Future<List>的方法。

  Future<List> loadData() async {
    await Future.delayed(const Duration(seconds: 3));
    var rsp = await Dio().get("https://jdmall.itying.com/api/pcate");
    return rsp.data["result"];
  }

StreamBuilder也是一个预置的StatefulWidget,用来监听Stream的数据。可以实现持续刷新。

 Center(
          child: StreamBuilder(
              stream: loadStreamData(),
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.active) {
                  if (snapshot.hasError) {
                    return Text("something wrong:${snapshot.error}");
                  }
                  return Text("${snapshot.data}");
                } else {
                  return CircularProgressIndicator();
                }
              }))

上例中,loadStreamData()方法是一个返回Stream<int>的方法。没有其他任何关键字修饰。

  Stream<int> loadStreamData() {
    return Stream.periodic(Duration(seconds: 5), (v) {
      return v;
    });
  }

每5s吐一个数,从0开始。

利用InkWell可以给任意组件添加点击事件,如单击、双击。

日期类DateTime,时间类TimeOfDay。showDatePicker展示日期选择控件,showTimePicker展示时间选择控件。控件默认是英文,可以配置国际化来展示中文。

利用json.encode(m)来把对象转成字符串,用json.decode(s)来把字符串转成Map。使用时需要import 'dart:convert';

利用dio包可以发起http请求。https://pub.dev/packages/dio

sleep:await Future.delayed(const Duration(seconds: 5));

 

posted on 2024-10-25 14:44  koushr  阅读(22)  评论(0编辑  收藏  举报

导航