flutter学习笔记-工程结构相关

327 阅读2分钟

appBar 设置透明

appBar: AppBar( 
 backgroundColor: Colors.transparent, 
 elevation: 0, 
 brightness: Brightness.light,


Flutter inspector  在手机屏幕上,查看控件所占有的位置大小。




Flutter四种工程类型

1. Flutter Application (全新的APP)

flutter create xxapp

2. Flutter Module (混编到已有的安卓/iOS工程内)

flutter create -t module xxapp_module

3. Flutter Plugin

Flutter平台插件工程,包含Dart层与Native平台层的实现

flutter create   --org   com.aliu --template=plugin  qr_scan

4. Flutter Package

Flutter纯Dart插件工程,仅包含Dart层的实现,往往定义一些公共Widget

flutter create --template=package xxapp_package

-i  修改 默认语言kotlin swift
-a   java 

StatefulWidget和StatelessWidget

将 命令式编程 ------> 声明式编程。

选用规则:父Widget能否通过初始化参数,来完全控制其UI展示效果。

重点:1、初始化参数,2、彻底控制。


tip

如Container这种图层,是非可视的容器,并不会参与绘制,对于非透明的视图叠加,flutter在绘制完成后,会做图层合并。

与大前端倡导的减少图层数量,做区分。


控制TextField获取焦点及失去焦点

场景:点击让文本框获取焦点,弹出键盘。

先定义一个FocusNode
FocusNode _commentFocus = FocusNode();
TextField(
    focusNode:_commentFocus, //*****
),

获取焦点

FocusScope.of(context).requestFocus(_commentFocus);

失去焦点

_commentFocus.unfocus();

控件部分

AspectRatio(
  aspectRatio: 1.85,


stack 

配合positioned(使用

Positioned.fill(
  top: 37.0,
  child: Column(

Row、Column

大小,宽度 决定因素

mainAxisAlignment
crossAxisAlignment: 
mainAxisSize:  MainAxisSize.min,


body: ListView.builder(
  itemCount: 8,
  itemBuilder: (_, index){
    return StickyHeader(
      header: Container(
        alignment: Alignment.centerLeft,
        width: double.infinity,
        color: Color(0xFFFAFAFA),
        padding: const EdgeInsets.only(left: 16.0),
        height: 34.0,
        child: Text("2018/06/0${index + 1}"),
      ),
      content: _buildItem(index),
    );


List<Widget> list = List.generate(index + 1, (i){
  return Container(
    height: 72.0,


resizeToAvoidBottomInset: false,


body: SafeArea(
  child: Column(
    children: <Widget>[
      Expanded(
        child: SingleChildScrollView(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,


Offstage(
  offstage: _isWechat,
  child: Column(
    children: <Widget>[


rootBundle.loadString(


child: AzListView(
  data: _bankList,
  itemBuilder: (context, model) => _buildListItem(model),
  isUseRealIndex: true,
  itemHeight: 40,
  suspensionWidget: null,
  suspensionHeight: 0,
  indexBarBuilder:(context, list, onTouch){
    return IndexBar(


Expanded(
  child: ListView.builder(
    physics: NeverScrollableScrollPhysics(),
    itemExtent: 40.0,
    itemCount: _bankNameList.length,
    itemBuilder: (_, index){
      return InkWell(


children: <Widget>[
  Opacity(


FocusNode _focusNode = FocusNode();
TextEditingController _controller = TextEditingController();


body: AnimatedContainer(
  alignment: Alignment.center,
  height: MediaQuery.of(context).size.height - MediaQuery.of(context).viewInsets.bottom,
  duration: const Duration(milliseconds: 120),
  curve: Curves.easeInCubic,


body: ListView.separated(
  itemCount: _list.length,
  separatorBuilder: (_, index) {
    return Divider(height: 0.6);
  },


showModalBottomSheet(
  context: context,
  builder: (BuildContext context) {
    return Material(
      color: Colors.white,
      child: SafeArea(


body: ListView.builder(
  itemCount: 8,
  itemBuilder: (_, index){
    return StickyHeader(
      header: Container(
        alignment: Alignment.centerLeft,
        width: double.infinity,
        color: Color(0xFFFAFAFA),
        padding: const EdgeInsets.only(left: 16.0),
        height: 34.0,
        child: Text("2018/06/0${index + 1}"),
      ),
      content: _buildItem(index),


flutter反射相关

1、运行时反射破坏了类的封装性和安全性,会带来安全风险。

      Fastjson 框架就爆出了一个巨大的安全漏洞。这个漏洞使得精心构造的字符串文本,可以在反序列化时让服务器执行任意代码,直接导致业务机器被远程控制、内网渗透、窃取敏感信息等操作。

2、运行时反射会增加二进制文件大小。因为搞不清楚哪些代码可能会在运行时用到,因此使用反射后,会默认使用所有代码构建应用程序,这就导致编译器无法优化编译期间未使用的代码,应用安装包体积无法进一步压缩,这对于自带 Dart 虚拟机的 Flutter 应用程序是难以接受的。

so,没有反射,json文件解析,就得手动做解析了。