iOS Development Guidelines
  • Introduction
  • 规范
    • 0. 介绍
    • 1. 序言
    • 2. 代码命名规范
      • 2.1. 代码命名基础
      • 2.2. 方法(Method)命名
      • 2.3. 函数(Function)命名
      • 2.4. 属性(Property)与数据类型命名
      • 2.5. 其它命名规范
      • 2.6. 可接受缩略名
    • 3. 代码格式规范
      • 3.1. 代码注释格式
      • 3.2. 代码结构与排版
    • 4. 开发实践
      • 4.1. Objective-C保留字
    • 5. Xcode工程结构
    • 6. 版本控制
      • 6.1. Git基本配置
      • 6.2. Git分支模型
      • 6.3. SVN源代码管理规范
      • 6.4. SVN的标准目录结构
    • 7. 附录
      • 7.1. Xcode扩展插件
      • 7.2. 第三方开源库
    • 8. 参考
    • 9. iOS开发优化
  • Swift编码规范
  • Objective-C新特性
  • iOS生命周期
  • Apple 官方设计指南
    • iOS 人机交互指南
      • 概览 - 设计理念
      • 概览 - iOS 10 新功能
      • 概览 - 接口要素
      • 交互 - 3D Touch
      • 交互 - 辅助功能
      • 交互 - 音频
      • 交互 - 身份验证
      • 交互 - 数据输入
      • 交互 - 反馈
      • 交互 - 文件处理
      • 交互 - 初次启动体验
      • 交互 - 手势
      • 交互 - 加载
      • 交互 - 模态
      • 交互 - 导航
      • 交互 - 评分和评论
      • 交互 - 请求权限
      • 交互 - 设置
      • 交互 - 术语
      • 交互 - 撤销与重做
      • 系统功能 - 多任务
      • 系统功能 - 通知
      • 系统功能 - 打印
      • 系统功能 - 快速预览
      • 系统功能 - Siri
      • 系统功能 - TV 供应商
      • 可视化设计 - 动画
      • 可视化设计 - 品牌化
      • 可视化设计 - 颜色
      • 可视化设计 - 布局
      • 图像 - 应用图标
  • Apple 官方开发指南
    • App 发布指南
      • 待完善
    • Cocoa 代码指南
      • 代码命名基础
      • 方法命名
      • 函数命名
      • 属性和数据类型命名
      • 可接受的缩写词和首字母缩写词
      • 针对框架开发者的技术细节
    • 核心蓝牙编程指南
      • 待完善
  • iOS 杂谈
    • Auto Layout 是怎么进行自动布局的性能如何
    • App 启动速度的优化与监控
    • 多人的大项目,架构怎么设计更合理
    • 链接器:符号是怎么绑定到地址上的
    • App 如何通过注入动态库的方式实现极速编译调试
    • 静态分析工具的选择
    • Clang的App 提质
    • 无侵入的埋点方案如何实现
    • 包大小:如何从资源和代码层面实现全方位瘦身
    • iOS 崩溃千奇百怪如何全面监控
    • 如何利用 RunLoop 原理去监控卡顿
    • 临近 OOM,如何获取详细内存分配信息,分析内存问题
    • 日志监控:怎样获取 App 中的全量日志
    • 性能监控:衡量 App 质量的那把尺
    • 远超想象的多线程的那些坑
    • 怎么减少 App 电量消耗
    • 除了 Cocoa,iOS还可以用哪些 GUI 框架开发
    • 细说 iOS 响应式框架变迁,哪些思想可以为我所用
    • 如何构造酷炫的物理效果和过场动画效果
    • A/B 测试:验证决策效果的利器
    • 怎样构建底层的发布和订阅事件总线
    • 如何提高 JSON 解析的性能
    • 如何用 Flexbox 思路开发?跟自动布局比,Flexbox 好在哪
    • 怎么应对各种富文本表现需求
    • 如何在 iOS 中进行面向测试驱动开发和面向行为驱动开发
    • 如何制定一套适合自己团队的 iOS 编码规范
    • iOS 系统内核 XNU:App 如何加载
    • iOS 黑魔法 Runtime Method Swizzling 背后的原理
    • libffi:动态调用和定义 C 函数
    • iOS 是怎么管理内存的
    • 如何编写 Clang 插件
    • 打通前端与原生的桥梁:JavaScriptCore 能干哪些事情
    • React Native、Flutter 等,这些跨端方案怎么选
    • 原生布局转到前端布局,开发思路有哪些转变
    • iOS原生、大前端和Flutter分别是怎么渲染的
    • 剖析使 App 具有动态化和热更新能力的方案
  • Flutter
    • 0.Flutter学习笔记以及问题记录
    • 1.Dart基础快速入门
    • 2.什么是声明式UI
    • 3.Flutter入门基础知识
    • 4.项目结构、资源、依赖和本地化
    • 6.布局与列表
    • 7.状态管理
    • 8.路由与导航
    • 9.手势检测及触摸事件处理
    • 9.线程和异步UI
    • 10.主题和文字处理
    • 11.表单输入与富文本
    • 12.调用硬件、第三方服务以及平台交互、通知
    • 13.基于Http实现网络操作
    • 14.图片控件开发详解
    • 15.异步:Future与FutureBuilder实用技巧
    • 16.APP首页框架搭建-Scaffold与PageView
Powered by GitBook
On this page
  • 新建项目
  • Flutter原理介绍(讲的比较透彻和全面的文章)
  • (免费视频)Dart编程语言基础学习
  • (免费视频)Flutter 入门与实战-基础视频学习
  • Flutter 从入门到进阶-demo
  • Flutter 增加Json 序列化反序列化
  • Json转Dart 在线工具
  • .基础结构
  • 遇到的奇葩问题 页面路由跳转

Was this helpful?

  1. Flutter

0.Flutter学习笔记以及问题记录

PreviousFlutterNext1.Dart基础快速入门

Last updated 3 years ago

Was this helpful?

新建项目

1、Flutter create xxxx 先用命令建好项目再到工具内,打开项目。这样比较快

声明:Flutter专栏文档均来自慕课网

Flutter原理介绍(讲的比较透彻和全面的文章)

(免费视频)Dart编程语言基础学习

(免费视频)Flutter 入门与实战-基础视频学习

Flutter 从入门到进阶-demo

Flutter 增加Json 序列化反序列化

Json转Dart 在线工具

.基础结构

// 引入基础样式 material
import 'package:flutter/material.dart';

// 入口文件
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // 重写方法
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Welcome to Flutter",
      // 脚手架组件 具体点击进入看源码
      home: Scaffold(
        // 属性是小写,有哪些属性,在源码中可以清楚的看见,引入的对象是大写 AppBar
        appBar: AppBar(
          title: Text("Hello World 你好"),
        ),
        // 内容
        body: Center(
          // 用容器来存放子项
          child: Container(
            // 容器内 添加一个 Text
            child: new Text("这个是内容啊啊啊啊",
              style: TextStyle(
                  fontSize: 20,
                  color: Colors.white
              ),
            ),
            // 设置容器padding
            padding: EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 30.0),
            // 设置容器内对其方式
            alignment: Alignment.topLeft,
            // 设置容器margin
            margin: EdgeInsets.fromLTRB(20, 20, 20, 30),
            width: 400,
            height: 300,
            // 设置容器叠加背景
            decoration: BoxDecoration(
                // 这里用线性渐变
                gradient:LinearGradient(
                    colors: <Color>[Colors.blueGrey,Colors.white]
                )
            ),
          ),
        ),
      ),
    );
  }
}

横向ListView 与Listview代码抽离

// 引入material UI
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 返回Material风格的App
    return new MaterialApp(
      title: "list demo测试",
      // 页面脚手架
      home: Scaffold(
        // 标题栏
        appBar: AppBar(
          // title
          title: new Text("list view 测试"),
          // 标题栏背景
          backgroundColor: Colors.blueGrey,
        ),
        // 内容模块 ->这里设置居中
        body: Center(
            // 内容设置一个容器,高度为200,容器内 填充内容 为 listview
            child: Container(
              height: 200,
              // 将listview控件抽离出去 并传递默认宽度
              child: new MyList(300.0),
        )),
      ),
    );
  }
}

// Listview 抽离
class MyList extends StatelessWidget {
  double width = 200;

  MyList(double w){
    this.width = w;
  }

  @override
  Widget build(BuildContext context) {
    return new ListView(
      scrollDirection: Axis.horizontal,
      children: <Widget>[
        new Container(
          width: this.width,
          color: Colors.deepOrange,
        ),
        new Container(
          width: this.width,
          color: Colors.blueGrey,
        ),
        new Container(
          width: this.width,
          color: Colors.lightBlue,
        ),
        new Container(
          width: this.width,
          color: Colors.green,
        ),
        new Container(
          width: this.width,
          color: Colors.yellowAccent,
        ),
      ],
    );
  }
}

ListView动态填充数据

// 引入material UI
import 'package:flutter/material.dart';

void main() => runApp(MyApp(
    dataList: new List<String>.generate(1000, (i) => "Item $i")
));

class MyApp extends StatelessWidget {
  List<String> dataList;

  MyApp({Key key,this.dataList}):super(key:key);

  @override
  Widget build(BuildContext context) {
    // 返回Material风格的App
    return new MaterialApp(
      title: "list demo测试",
      // 页面脚手架
      home: Scaffold(
        // 标题栏
        appBar: AppBar(
          // title
          title: new Text("list view 测试"),
          // 标题栏背景
          backgroundColor: Colors.blueGrey,
        ),
        // 内容模块 ->这里设置居中
        body: new MyList(dataList),
      ),
    );
  }
}

// Listview 抽离
class MyList extends StatelessWidget {
  List<String> dataList = new List();
  MyList(List<String> items){
    this.dataList = items;
  }

  @override
  Widget build(BuildContext context) {
    return new ListView.builder(
        itemCount: dataList.length,
        itemBuilder: (BuildContext context, int index) {
          return new ListTile(
            title: new Text('Item $index'),
          );
        },
    );
  }
}

GridView demo

import 'package:flutter/material.dart';
// 初始化一个图片数组,模拟数据传递
var picArr = [
'http://222.186.12.239:10010/wde_150708/004.jpg',
'http://222.186.12.239:10010/suop_150709/001.jpg',
'http://222.186.12.239:10010/suop_150709/003.jpg',
];

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  List<String> picList=new List<String>();
  MyApp(){
    // 循环将数组图片插入到 list
    for(var pic in picArr){
      picList.add(pic);
    }
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "电影海报 实例",
      home: Scaffold(
        appBar: AppBar(title: new Text("电影海报实例")),
        // 将数据 传递给 独立 控件 MyGridView
        body: MyGridView(picList),
      ),
    );
  }
}

// 抽离控件GridView ,获取传递的数据
class MyGridView extends StatelessWidget{
  List picList = new List();
  MyGridView(List items){
    this.picList = items;
  }
  @override
  Widget build(BuildContext context) {
    return new GridView.builder(
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        // 一行3列
        crossAxisCount: 3,
        // 上下 间距
        mainAxisSpacing: 2.0,
        // 左右间距
        crossAxisSpacing: 2.0,
        // 图片长宽比
        childAspectRatio: 0.7,
      ),
      itemBuilder: (BuildContext context, int index) {
        return new Image.network(picList[index],fit: BoxFit.cover,);
      },
      itemCount: picList.length,
    );
  }

}

遇到的奇葩问题1:

org-dartlang-debug:synthetic_debug_expression:1:1: Error: String starting with ' must end with '.

'Unable to load asset: $key

解决办法:

--flutter clean

遇到的奇葩问题2:

Another exception was thrown: Exception: HTTP request failed, statusCode: 403

定位后发现,是后台接口token校验问题,

遇到的奇葩问题3

android 运行一直卡住 无法安装

解决办法

修改build.gradle,把里面的google()、jcenter()注释掉,因为要访问外网,改成aliyun代理网址

maven {
    url 'https://maven.aliyun.com/repository/google/'
}
maven{
    url 'https://maven.aliyun.com/repository/jcenter/'
}
maven{
    url 'https://maven.aliyun.com/nexus/content/groups/public'
}

然后,还有把gradle-wrapper.properties文件内gradle-4.10.x-all.zip 改成本地有的版本(必须是4.6 or 更新版)

#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip

自定义控件 + 传参定义

// Flutter
class CustomCard extends StatelessWidget {
  CustomCard({@required this.index, @required
  this.onPress});

  final index;
  final Function onPress;

  @override
  Widget build(BuildContext context) {
    return Card(
        child: Column(
          children: <Widget>[
            Text('Card $index'),
            FlatButton(
              child: const Text('Press'),
              onPressed: this.onPress,
            ),
          ],
        )
    );
  }
}
...
// Usage
CustomCard(
index: index,
onPress: () {
print('Card $index');
},
)
...

遇到的奇葩问题4

Waiting for another flutter command to release the startup lock…

On OSX: rm /Applications/flutter/bin/cache/lockfile

Waiting for another flutter command to release the startup lock…

flutter packages get --verbose

遇到的奇葩问题 页面路由跳转

Navigator operation requested with a context that does not include a Navigator.

The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget.

直接在MyApp中push是不行的。启动的时候 要包一层

[图片上传失败...(image-4b8271-1554889682077)]

https://coding.imooc.com/class/321.html
https://juejin.im/entry/5afa9769518825428630a61c
https://www.imooc.com/learn/1035
https://www.imooc.com/learn/1090
https://blog.csdn.net/hekaiyou/article/details/78037990
https://juejin.im/post/5b5f00e7e51d45190571172f
https://javiercbk.github.io/json_to_dart/
https://github.com/flutter/flutter/issues/17422
参照链接