Flutter


  • Links
  • Index
  • Manual
  • Note
  • Experience
  • ERPX App Code

Start

Flutter: New Project

如何运行

  1. 修改了 pubspec.yaml 会自动执行 flutter pug get

VS Code 打开项目 Flutter: Select Device

技巧

Cmd + .

Cmd + Shift + Space

Links

  • 借助:json_serializable 和 build_runner、json_annotation 库实现
  • https://github.com/Solido/awesome-flutter
  • https://github.com/Anxcye/anx-reader
  • https://guoshuyu.cn/home/wx/

Index

Manual

Note

main

void main() {
    runApp(
        const Center(),
    );
}

概念

Stateless / Stateful final widget

基础 widgets

Icon Icons ✓
Color Colors ✓
Container
  BoxDecoration
    border: Border.all(width: 10, color: Colors.black38),
    borderRadius: const BorderRadius.all(Radius.circular(8)),
Wrap
GridView
Image
Row,Column
  MainAxisalignment.spaceEvenly
  MainAxisSize.min
Stack
  Positioned
MaterialApp ?
SafeArea
Material class
Cupertino ?
Expanded
    flex
AppBar
Scaffold
GestureDetector
SizedBox
ListView
GridView

ListTile (Material)
Card (Material)
  Elevation
CircleAvatarAvatar

其他类

  • PreferredSize
  • AnimatedContainer
  • MaterialPageRoute 创建新路由
  • Navigator
    • pushName
    • ModalRout.of()
    • MaterialApp 和 CupertinoApp 构造器中的 onGenerateRoute() 来获取参数
EdgeInsets

BoxFit

DefaultTextStyle.merge()

经验

  • Fields in a Widget subclass are always marked "final".
  • .. 两个点 cascade notation 级联符号,可以连续调用同一个对象上的属性或方法。
  • 更改 assets 要重新run
  • 设置宽度 100%
    width: double.infinity // 定位下会失效
    
    width: MediaQuery.of(context).size.width
    

iOS

打包:

Product → Archive → distribute → development

其他问题

@override

fish redux state.remindController.text

https://www.jianshu.com/p/a1cf5cbad006

https://www.6hu.cc/archives/5585.html

https://zhuanlan.zhihu.com/p/94684556

https://blog.csdn.net/qq_38774121/article/details/114916292

Theme.of

part of

ERPX App

  • 修改 net_engine.dart 接口,要重新生成 .d.dart 文件:
# 一次构建
flutter packages pub run build_runner build --delete-conflicting-outputs

# 修改完成后,ctrl+s保存,实时构建
flutter packages pub run build_runner watch --delete-conflicting-outputs
  • Android 打包
flutter build apk --target-platform android-arm,android-arm64

packages

widget_lib/loading.dart flutter_refresh flutter/src/material/refresh_indicator.dart shared_preferences: ^2.2.2 # 轻量级本地键值对存储,可以缓存数据

main.dart

//flutter packages pub run build_runner build --delete-conflicting-outputs //flutter build apk --target-platform android-arm,android-arm64

ErrorHelper.catchError WidgetsFlutterBinding.ensureInitialized(); // 设置竖屏 // SystemChrome.setPreferredOrientations( // [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeRight, DeviceOrientation.landscapeRight, ]);

RightCache().setStockCardType(true);

mLocalStore

assert

import '../ui/process_log.dart';

static

ViewService viewService

FloatingActionButton

setRawSize

state clone()

    child: SizedBox(
      height: 200,
      child: GridView.builder(
        itemCount: 4,
        //SliverGridDelegateWithFixedCrossAxisCount 构建一个横轴固定数量Widget
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
          mainAxisSpacing: 20.0,
          crossAxisSpacing: 10.0,
        ),
        itemBuilder: (BuildContext context, int index) {
          //Widget Function(BuildContext context, int index)
          // return getItemContainer(datas[index]);
          return TextButton(
            child: Row(
              children: [
                new Icon(Icons.check_circle_outline_rounded),
                Text(state.filterParams[i]['name']),
              ],
            ),
            onPressed: () async {
              if (state.queryTradeOrderPageParams['pageTab'] == '2') {
                return;
              }
              await dispatch(
                  OrderListActionCreator.setTradeOrderPageParams({
                'key': 'pageTab',
                'value': '2',
              }));
              await dispatch(OrderListActionCreator.onHeaderRefresh());
            },
          );
        },
      ),
    ),

builder