flutter备忘录

一篇很好的文章https://www.jianshu.com/p/a0d67d368b92

Container背景图片(设置圆角)

Container(
                    height: 60,
                    width: 300,
                    decoration: BoxDecoration(
                      color: Colors.red,
                      image: DecorationImage(image: AssetImage("images/worldBuilding/zhifubao.png"),fit: BoxFit.fitHeight),
                      borderRadius: BorderRadius.all(Radius.circular(60))
                    ),
                  )

圆角按钮

Container(
              height: 45,
              width: MediaQuery.of(context).size.width,
              margin: const EdgeInsets.only(left: 20,right: 20,bottom: 20),
              decoration: BoxDecoration(
                  color: Colors.white,
                  border: Border.all(color: Colors.blue,width: 1),
                  borderRadius: BorderRadius.all(Radius.circular(20))),
              child: Container(
                child: FlatButton(
                    onPressed: () {
                      _onPressLogin();
                    },
                    shape: RoundedRectangleBorder(
                        borderRadius:
                        BorderRadius.all(Radius.circular(20))),
                    child: Text(
                      "手机登录/注册",
                      style: TextStyle(color: Colors.blue, fontSize: 14),
                    )),
              ),
            )

屏幕宽高

MediaQuery.of(context).size.width;
MediaQuery.of(context).size.height;

Container的width、height

width:container的宽度,设置为double.infinity可以强制在宽度上撑满,不设置,则根据child和父节点两者一起布局。

height:container的高度,设置为double.infinity可以强制在高度上撑满。

Android状态栏去掉背景

//MainActivity中代码
public class MainActivity extends FlutterActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //修改状态栏颜色
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
      getWindow().setStatusBarColor(0);
    }
    GeneratedPluginRegistrant.registerWith(this);
  }
}

设置状态栏文字颜色

//在ThemeData中设置
appBarTheme: AppBarTheme(
            color: Colors.white,
            brightness: Brightness.dark,//状态栏亮色调,文字黑色
            iconTheme: IconThemeData(
                color: Colors.black54,
                opacity: 1,
              size: 100,
            )
        )

在当前页面设置状态栏文字颜色

//方法一:在Android可以,在iOS好像不可以😂
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light
            .copyWith(statusBarBrightness: Brightness.light));
//方法二
return AnnotatedRegion<SystemUiOverlayStyle>(
      value: SystemUiOverlayStyle.dark,
      child: Material(child:Scaffold(
        body: Container(color: Colors.white,),
      ),),);

参考文章
https://www.jianshu.com/p/15700d9145aa
https://blog.csdn.net/wo122282967/article/details/88788851
https://www.jianshu.com/p/9409845d8794

内容显示到状态栏位置

@override
  Widget build(BuildContext context) {
    
    return Scaffold(
      body: ListView.builder(
        padding: const EdgeInsets.all(0.0),//设置padding属性
          itemBuilder: _itemBuilder
      ),
    );
}

支付宝蚂蚁森林滚动渐变导航栏效果以及页面显示到最上面

  @override
  Widget build(BuildContext context) {
    
    // TODO: implement build
    return Scaffold(
      body: Stack(
        children: <Widget>[
          ListView.builder(
            padding: const EdgeInsets.all(0.0), //内容显示到最上面,状态栏背后
            controller: _scrollController,
            itemBuilder: _itemBuilder,
            itemCount: itemCount,
          ),
          Positioned()//这里手写导航栏
        ],
      ),
    );
  }
_scrollController.addListener((){
      print("偏移量${_scrollController.offset}");
      if (_scrollController.offset < 20) {
        SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light
            .copyWith(statusBarBrightness: Brightness.light));
        setState(() {
          this._actionBarView = null;
        });
      }
      //and so on
    });

圆角头像带点击事件

FlatButton(onPressed: (){
                    _showImgPicker();
                  }, child: Container(
                    height: 70,
                    width: 70,
                    child: ClipOval(
                      child: _image == null
                          ? Image.asset("images/mine/touxiangzhanwei.png")
                          : Image.file(_image,fit: BoxFit.fitWidth,),
                    ),
                  ))

pub finished with exit code 78

如果运行此行出错

flutter packages pub run build_runner build

那么可以直接运行

flutter packages pub run build_runner build --delete-conflicting-outputs

图片上传

Dio支持发送 FormData, 请求数据将会以 multipart/form-data方式编码, FormData中可以一个或多个包含文件 .

注意: 只有 post 方法支持发送 FormData.

FormData formData = new FormData.from({
    "name": "wendux",
    "age": 25,
    "file": new UploadFileInfo(new File("./example/upload.txt"), "upload.txt")
});
response = await dio.post("/info", data: formData)

图片转二进制流

File imgFile;

imgFile.readAsBytes().then((data) {
    
    });

flutter打包

首先务必详细阅读官方说明文档,根据flutter官网进行配置
Androidhttps://flutterchina.club/android-release/
iOShttps://flutterchina.club/ios-release/

iOS进入工程目录下运行

flutter build ios

成功之后重新打开xcode打包

Android进入工程目录下运行

flutter build apk

成功之后获取包 <app dir>/build/app/outputs/apk/app-release.apk

flutter实现微信登录/微信分享

在微信开放平台设置签名,那么怎么获取签名呢?

  1. 进入key.jks文件所在目录
    2.运行命令 keytool -list -v -keystore key.jks
    3.获取MD5值,去掉中间分号输入到微信开放平台中

⚠️我只是试了一下这么做可以,不知道其他方式可不可以😂

flutter截图

声明key切图使用

GlobalKey rootWidgetKey = GlobalKey(); 
/*获取截图*/
  Future<Uint8List> _capturePng() async {
    try {
      RenderRepaintBoundary boundary =
          rootWidgetKey.currentContext.findRenderObject();
      var image = await boundary.toImage(pixelRatio: 2.5);//控制图片清晰度
      ByteData byteData = await image.toByteData(format: ImageByteFormat.png);
      Uint8List pngBytes = byteData.buffer.asUint8List();
      return pngBytes; //这个对象就是图片数据
    } catch (e) {
      print(e);
    }
//    return null;
  }
//截图区域
RepaintBoundary(
                      key: rootWidgetKey,
                       child: Container(),//要截取的区域
)

flutter图片文件读写

_capturePng().then((imgData) {
      if (imgData != null) {
        getApplicationDocumentsDirectory().then((appDocDir) {
          String appDocPath = appDocDir.path + "/shareImg.png";
          File file = File(appDocPath);
          file.writeAsBytes(imgData).then((f) {
            if (type == 1) {
              fluwx
                  .share(WeChatShareImageModel(
                      image: "file://" + appDocPath,
                      scene: WeChatScene.SESSION))
                  .then((a) {
                print("微信分享结果" + a.toString());
              });
            } else if (type == 2) {
              fluwx
                  .share(WeChatShareImageModel(
                      image: "file://" + appDocPath,
                      scene: WeChatScene.TIMELINE))
                  .then((a) {
                print("微信分享结果" + a.toString());
              });
            }
          });
        });
      }
    });

适配刘海屏SafeArea

如果整个页面只使用SafeArea

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return SafeArea(
      child: Container(
        color: Colors.red,
      ),
    );
  }

可以看到页面显示避开了上下的安全区域

safeArea-01.png

我们可以手动关闭其适应上下安全区

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return SafeArea(
      child: Container(
        color: Colors.red,
      ),
      top: false,
      bottom: false,
    );
  }
safeArea-02.png

当页面使用Scaffold时不需要考虑顶部安全区域了,只适配底部就可以了

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      backgroundColor: Colors.yellow, //可以用来设置底部安全区域的背景颜色(当bottom: true时)
      appBar: AppBar(
        title: Text("SafeArea"),
      ),
      body: SafeArea(
        child: Container(
          color: Colors.red,
        ),
        bottom: true, //true不将内容显示到底部安全区域內,false将内容显示到底部安全区域
      ),
    );
  }
safeArea-03.png
safeArea-04.png

flutter长按复制

                                    GestureDetector(
                                      onLongPress: (){
                                        Clipboard.setData(ClipboardData(text: "musk@ivygate.cn"));
                                        Fluttertoast.showToast(msg: "邮箱已复制到剪切板");
                                      },
                                      child: Text("musk@ivygate.cn",
                                          style: TextStyle(
                                              fontSize: 16,
                                              color: Colors.black)),
                                    )

软键盘顶起布局

Scaffold(
  resizeToAvoidBottomPadding: false,
)

double保留后2位小数

double vv = 12.3333333;
vv.toStringAsFixed(2);

跳转页面顺便关掉当前页面

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