@_@小刘同学flutter基础——持续更新

Flutter widgets

stateful widgets

stateful widget 中可以通过传入的data(external data)参数重新渲染组件, 同时在组件内部改变数据(internal data)

class MyApp extends StatefulWidget {
  final String text;
  MyApp(this.text); // constructor
    State<StatefulWidget> createstate(){
        return _myapp()
    }
}

class _myapp extends State<MyApp>{
    List<String> texts = [];
    void iniState() {
        super.initState();
        this.texts.add(Widget.text);
    }// Widget 
    Widget build(BuildContext context) {
        return //return something
            ...
            onPressed(
            setState() {
                //do something
            }
        )
    }
}

stateless widget

stateless widget 用于渲染普通组件, 静态组件

class Product extends StatelessWidget {
  final List<String> products;
  Product(this.products);
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Column(
      children: products
          .map(
            (element) => Card(
                  elevation: 6.0,
                  child: Column(
                    children: <Widget>[
                      Image.asset('assets/food.jpg'),
                      Text(element)
                    ],
                  ),
                ), //card
          )
          .toList(),
    );
  }
}

Create ListView

用来创建一个dynamic list

使用 ListView.builder

Widget build(BuildContext context){
return ListView.builder(
    itemBuilder: ,// how to create a widget
    itemCount: // how many times
)
}

假设我们定义了一个List<String>

itemCount 就是长度: products.length

itembuilder 对应了一个widget 带两个参数:

widget pattern(BuildContext context, int index) {
    return Card(
        child: Column(
            children: <Widget>[
                Image.asset('.../...'),
                Text(products[index])
            ]
        )
    )
}

这种方法更加节省资源, 只会创建在页面上能看见的widget ,未出现的不会创建后占用内存

然后, 当我们想在另一个文件中使用listview, 我们需要添加Expanded

Expanded(
    child: pattern()
)

Tabs & Drawers

添加tab bars, 用DefaultTabController 来wrap整个widget, 然后在body中最外层使用TabView

tabs

bottom

使用 bottonNavigationbars

bottomNavigationBar: 
          TabBar(
            labelColor: Theme.of(context).primaryColor,
            unselectedLabelColor: Colors.grey,
            tabs: <Widget>[
              Tab(
                icon: Icon(Icons.create),
                text: 'create product',
              ),
              Tab(
                icon: Icon(Icons.list),
                text: 'my products',
              )
            ],
          ),
top

在appbar 添加一个bottom 属性, 然后再用TabBar

appBar: AppBar(
    title: Text('title'),
    bottom:           
    TabBar(
            labelColor: Theme.of(context).primaryColor,
            unselectedLabelColor: Colors.grey,
            tabs: <Widget>[
              Tab(
                icon: Icon(Icons.create),
                text: 'create product',
              ),
              Tab(
                icon: Icon(Icons.list),
                text: 'my products',
              )
            ],
          ),
)

drawers

单独添加drawer组件

          drawer: Drawer(
            child: Column(
              children: <Widget>[
                AppBar(
                  automaticallyImplyLeading: false,
                  title: Text('choose'),
                ),
                ListTile(
                  title: Text('Manage Products'),
                  onTap: () {
                    Navigator.pushReplacement(
                        context,
                        MaterialPageRoute(
                            builder: (BuildContext context) =>
                                ProductCenter()));
                  },
                ),
                ListTile(
                  title: Text('Home'),
                  onTap: () {
                    Navigator.pushReplacement(
                        context,
                        MaterialPageRoute(
                            builder: (BuildContext context) => Home()));
                  },
                )
              ],
            ),
          ),

先在外层用Column,这样可以添加组件列表,
然后在组件列表里添加drawer里要显示的Appbar(automaticallyImplyLeading: false 默认为true的时候, 会在drawer的appbar中再添加一个) , 和 ListTiles(每个ListTile对应了一个按钮栏)

Container

padding

EdgeInsets

decoration

decoration: BoxDecoration(
color: //,
border: Border(
    bottom: BorderSide()
    Top://
    Left://
    Right://
)
)

Row / Column

mainAxisAlignment// x轴布局

crossAxisAlignment//y轴布局

Flutter navigation

向 stack 里pop and push 会销毁所有的数据,因此要保留数据的话 ,需要用到路由管理

push

onPressed: ()=>Navigator.push<returnType>(
    context,// contains the infomation of current widget
    MaterialPageRoute(
        build: (BuildContext buildcontext) => SomeWidget(param1, param2)
    )
).then(
    (returnType value) {
        print(value)
    }
)

pushReplacement

同push , 但是替代当前stack,表现为无返回按钮

pushReplacementNamed

flutter中的路由管理, 用路径名代替builder,需要用到Navigator. pushReplacementNamed方法
在main中设置:

MaterialApp{
theme: ,
home: Auth(),
routes: //添加routes属性
{
        '/admin': (BuildContext context) => ProductCenter(),
        '/Home': (BuildContext context) => Home(this.products, this.deleteProduct, this.addProduct),
}, // 注意’/‘ 路径默认分配给home属性, 所以Auth 对应 ’/‘
}

一种特殊情况, 假设有一个ListView, 我们知道要用ListView.builder{ } 来传入一个itemBuilder widget 带一个index参数, 和一个itemCount。那么我们如果要制作一个详情页, 要求把每一个Item单独传入, 那么我们用builder的时候 会写成:

onPressed: ()=>Navigator.push<returnType>(
    context,// contains the infomation of current widget
    MaterialPageRoute(
        build: (BuildContext buildcontext) => SomeWidget(List[index])
    )
).then(
    (returnType value) {
        print(value)
    }
)

但是怎么改成路由呢?
flutter不支持类似/home/{index} 类似的写法
instead,在main里, 可以在route后添加onGenerateRoute(RouteSettings settings)
Routesettings 包含了路径名

      onGenerateRoute: (RouteSettings settings) {
        final List<String> pathElement = settings.name.split('/');
        if (pathElement[0] != '') {
          return null;
        }
        if (pathElement[1] == 'product') {
          final int index = int.parse(pathElement[2]);
          return MaterialPageRoute<bool>(
              builder: (BuildContext context) => ProductPage(
                  products[index]));
        }
      },

pop

对自定义按钮:

onpressed: () => Navigator.pop(context, true/false)

对实体按钮/默认返回按钮:

wrap the widget with WillPopScope

如果要用navigator另外pop带数据返回, 则默认Future.value为false

WillPopScope(
...
,
    onWillPoped: () {
        Navigator.pop(context, false)
        return Future.value(false)
    }
)

Dart 语法

const and final

  • final 指代, 某一个variable 一旦在内存中创建之后, 不能再创建新的variable, 只能在原有基础上进行更改
  • const 使变量创建好之后 , 无法对其内容进行进一步更改

[] and {} in constructor

{} make param named params
[] make param optional

传参

使得不同页面之间传递参数非常方便

  • regular data type
  • function
  • map
class MyApp extends StatelessWidget(
    final String string;
    final int int;
    final Map<String ,dynamic> myMap;
    final function onDelete;
    MyApp(this.string, this.int, this.myApp, this.onDelete);
    Widget build(BuildContext context){
    return ...
    }
)

私有函数

私有函数以划线开头

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容