变量和基本数据类型

变量定义

var name = '张三';

常量定义

final,const都可以表示常量,const为编译时常量,final只能被设置一次

数据类型

类型 说明 使用
int 整型 var a = 123
double 浮点型 var b = 123.0;
boolean 布尔型 var isDone = true
string 字符串 var name = ‘abcd’
list 列表 var list = [1, 2, 3, 4, 5]
map 键值对 var map = {‘id’: ‘sn123’, ‘name’: ‘zhangsan’}

函数

函数定义

String getUserInfo(String name, [String form], [String sex = 'male']) {
    ...
    return result;
}

方括号其中的是可选参数,可选参数可以指定默认值

main函数

void main => runApp(MyApp())

运算符

三元运算符: condition条件为真,返回expr1,否则返回expr2

condition ? expr1 : expr2

第二种??表达式:expr1非空返回其值,否则返回expr2

expr1 ?? expr2

级联操作

级联操作用两个点(..)表示,对同一个对象做一系列操作

State状态

  • initState
    当插入渲染树的时候调用,这个函数在生命周期中只调用一次。这里可以做一些初始化工作,比如初始化State的变量。

  • didChangeDependencies
    初始化时,在initState()之后立刻调用

  • build 初始化后绘制界面的时候调用

  • didUpdateWidget
    祖先节点rebuild widget时调用 .当组件的状态改变的时候就会调用didUpdateWidget.

  • dispose 组件销毁的时候调用,这个函数一般会移除监听,清理环境。


异步操作

一般使用async函数和await表达式实现异步操作

定义异步操作方法

await readFile()

必须在一个使用了async关键字标记的函数中使用await表达式

fileOperate() async {
    var file = await readFile();
}

网络访问

GET访问

try {
  HttpClient httpClient = new HttpClient();
  HttpClientRequest request = await httpClient.getUrl(Uri.parse("https://www.v2ex.com/api/topics/hot.json"));

  request.headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0");

  HttpClientResponse response = await request.close();

  List result = json.decode(await response.transform(utf8.decoder).join());
  print(result.toString());
  setState(() {
    _items = result;
  });

  httpClient.close();

}catch(e) {
  e.toString();
}

POST访问


Provider

导入包

pubspec.yaml

dependencies:
    provider: ^3.1.0

创建model类

这里需要混入ChangeNotifer,修改的时候还需要调用notifyListeners()通知刷新

class Counter with ChangeNotifier {
    int _count;
    Counter(this._count);

    void add() {
        _count++;
        notifyListeners();
    }

    get count => _count;
}

外层页面

创建共享的顶层数据,外层需要ChangeNotifierProvider包裹,builder()方法初始化数据对象,显示值的时候使用Provider.of()方法获取对象

class ProviderExampleViewPage extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        // TODO: implement build
        return ChangeNotifierProvider<Counter> (
        builder: (context) => Counter(1),
        child: Scaffold(
            appBar: AppBar(
            title: Text('ProviderExampleViewPage'),
            ),

            body: Center(
            child: Column(
                children: <Widget>[
                Consumer<Counter>(
                    builder: (context, counter, _) => Text("${Provider.of<Counter>(context).count}"),
                ),
                ChangerWidget(),
                ],
            ),
            ),
        ),
        );
    }
}

内层页面

直接使用Privider.of()方法获取model对象,进行修改的时候就会在不同页面直接进行数据同步和刷新。

class ChangerWidget extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        // TODO: implement build
        return RaisedButton(
        child: Text('Plus one'),
            onPressed: () {
                var counter = Provider.of<Counter>(context);
                counter.add();
            },
        );
    }
}

Provider适用于在不同的Widget之间进行数据同步,同一个Widget中不起作用,widget内部的状态改变还是Stateful widget。

当有多个Provider的时候使用MultiPrivoder

MultiProvider(
    providers: [
        Provider<Foo>.value(value: foo),
        Provider<Bar>.value(value: bar),
        Provider<Baz>.value(value: baz),
    ],
    child: someWidget,
)