1. 使用AppBar后如何去掉左边的返回箭头。左边的图标对应的是leading,源代码如下(吐槽一下,CSDN暂不支持dart语言):

   Widget leading = widget.leading;
if (leading == null && widget.automaticallyImplyLeading) {
if (hasDrawer) {
leading = IconButton(
icon: const Icon(Icons.menu),
onPressed: _handleDrawerButton,
tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
);
} else {
if (canPop)
leading = useCloseButton ? const CloseButton() : const BackButton();
}
}
if (leading != null) {
leading = ConstrainedBox(
constraints: const BoxConstraints.tightFor(width: _kLeadingWidth),
child: leading,
);
}

修改方式为, leading为null,automaticallyImplyLeading为false:

appBar: AppBar(
  leading: null,
  automaticallyImplyLeading: false,
)

2. 使用flutter的canvas做文字绘制的时候用到的api为 TextPainter

3. 使用flutter绘制控件的时候想做到控件超出屏幕范围后自动换行,那么请参考 Wrap,可以轻松实现如下的布局:

4. 要实现类似安卓原生ViewPager的UI,请使用 PageView,注意定义自己的 PageController,然后可以利用PageController的jumpToPage(int)实现自定义的Page页的跳转

5. 要实现类似顶部和底部导航栏,请参考 TabBar,适当的时候可以和 AppBar 结合使用

6. flutter is a SingleTickerProviderStateMixin but multiple tickers were created. 报错,原因是多个地方调用setState请求重绘,但是state使用的是SingleTickerProviderStateMixin ,将其改成TickerProviderStateMixin即可。

7. 解决类冲突的问题,比如,我自定义一个Banner.dart类,这个类跟系统的Banner冲突,那么我们可以这样解决。

import 'package:flutter/material.dart';
import 'package:myproject/Banner.dart' as myproject; //这样使用我们自己的Banner
myproject.Banner _myBanner;
//系统的Banner
Banner _banner;

8. 解决Android手机布局浸入到状态栏的问题,用一个 SafeArea 进行包装即可,如下:

SafeArea(
top: true,
child: MaterialApp(
home: ,
),);

9. 在切换 tabbar 或者 pageview 的时候要保存上一个tab widget 的状态,参考 AutomaticKeepAliveClientMixin 既可,如下:

//假如PageView有四个子页面

 @override
Widget build(BuildContext context) {
return Scaffold(
body: PageView(
controller: pageController,
children: <Widget>[
ArticlesPage(),
ProjectPage(),
NavigationPage(),
CollectionArticlesPage(),
],
onPageChanged: changePage,
),
bottomNavigationBar: Navigations(_page, changePage));
} //然后在子Page的State分别实现with AutomaticKeepAliveClientMixin,wantkeepAlive返回true class ArticlesPageState extends State<ArticlesPage> with AutomaticKeepAliveClientMixin{
@override
bool get wantKeepAlive => true;
} class ProjectPageState extends State<ProjectPage> with AutomaticKeepAliveClientMixin{
@override
bool get wantKeepAlive => true;
} class NavigationPageState extends State<NavigationPage> with AutomaticKeepAliveClientMixin{
@override
bool get wantKeepAlive => true;
} class CollectionArticlesPageState extends State<CollectionArticlesPage> with AutomaticKeepAliveClientMixin{
@override
bool get wantKeepAlive => true;
}

10. Android手机启动时候白屏的问题解决,android/app/src/main/res/drawable/launch_background.xml中定义了自定义splash的方法:

<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" /> <!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

将<item>注释去掉,替换为自己的launcher_image即可 。

11.  界面存在输入框的时候,点击后软键盘将页面顶起来导致页面重绘的问题(Android fitsystem),可以通过将Scaffold的resizeToAvoidBottomPadding属性设置为false来关闭重绘,如下:

return Scaffold(
resizeToAvoidBottomPadding: false,
);

12. 修改TextFiled的边界宽度,可以通过decoration的contentPadding属性进行修改,如下:

return TextField(
decoration: InputDecoration(
contentPadding: EdgeInsets.all(8),
),
);

13. 如果想实现一个布局,在某些条件下显示,可以采用 Offstage 布局,动态控制其offstage属性值即可

14. 如果出现弹出输入法的时候导致Overflow错误,可以将布局镶嵌到SingleChildScrollView中,比如:

return Scaffold(
body: SingleChildScrollView(
child: Container(
constraints: BoxConstraints(
maxHeight: MediaQuery.of(context).size.height,
maxWidth: MediaQuery.of(context).size.width,
),
),
),
);

15. GridView的item宽高默认是1:1,可以通过修改childAspectRatio的值来进行宽高的修改,该值代表宽:高

16. flutter中绘制虚线,使用  path_drawing

17. flutter 中禁用GridView的滚动,可以使用physics属性,取值为NeverScrollableScrollPhysics(),如下:

GridView.count(
physics: NeverScrollableScrollPhysics(),
);

18. flutter隐藏状态栏,使用:

SystemChrome.setEnabledSystemUIOverlays([]);

19. 监听某个widget是否已经渲染完成,使用WidgetsBinding,方法是在initstate或者build中注册回调,如下:

WidgetsBinding.instance.addPostFrameCallback((callback){
print("complete");
});

20. flutter设置屏幕支持的方向:

以下设置为设置整个项目运行到时候只允许横屏,如果需要其他方向,可以参考设置。

SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]).then((_){
runApp(MyApp());
});

对于IOS来说,可能我们设置只允许横屏了,但是效果确依旧可以竖屏,记得修改xcode的General--Deployment Info--Device Orientation属性,自己勾选对应的方向,如下。

设置屏幕显示方向,由于flutter中有bug,在IOS端可能不生效,需要插件支持,见 https://github.com/jadennn/flutter_orientation

21. flutter设置多语言支持的时候发现在IOS端只显示英语的bug,是由于xcode中默认没有添加中文(其他语言类似)的选择,解决办法,在Info--Locallzations中选择需要的语言,如下:

22. flutter中禁止控件复用,可以使用不同的key,比如说,如果我们有一个stateful的控件,在initstate中进行了一些值的初始计算,在页面中需要展示多个这样的控件,不想多个控件公用同一套参数(换句话说,initstate只会在第一次初始化的时候调用),那么可以设置不同的key。

23. 裁剪图片的方法:

i

import 'dart:ui' as DartUi;

///根据src和dst裁剪图片
static DartUi.Image getCroppedImage(DartUi.Image image, Rect src, Rect dst) {
var pictureRecorder = new DartUi.PictureRecorder();
Canvas canvas = new Canvas(pictureRecorder);
canvas.drawImageRect(image, src, dst, Paint());
return pictureRecorder
.endRecording()
.toImage(dst.width.floor(), dst.height.floor());
}

24. 在不使用BuildContext的情况下进行页面跳转:

a. 创建一个global的key

static GlobalKey<NavigatorState> gNavigatorKey = new GlobalKey<NavigatorState>();

b. 在MaterialApp初始化的时候使用

return MaterialApp(
navigatorKey: Global.gNavigatorKey,
routes: <String, WidgetBuilder> {
'/login': (BuildContext context) => new LoginPage(),
},

//....代码省略
    c. 需要的地方使用:

Global.gNavigatorKey.currentState.pushNamedAndRemoveUntil('/login',(_) => false);

注意的是这种方法代价比较大,除非特殊情况,否则不建议使用。使用的时候根据不同的场景调用不同的push方法

25. IOS卡在闪屏页的解决方案:

先运行 flutter build ios , 然后再在xcode中archive

作者:Hirabbit_jaden   来源:CSDN 

 

flutter入门之常见的flutter问题汇总(转)的更多相关文章

  1. Flutter从入门到进阶实战携程网App_汇总贴

    视频地址:https://coding.imooc.com/class/321.html?mc_marking=60e5294c605a87b2af7257d06f70505e&mc_chan ...

  2. Flutter入门教程(四)第一个flutter项目解析

    一.创建一个Flutter工程 1.1 命令行创建 首先我们找一个空目录用来专门存放flutter项目,然后在路径中直接输入cmd: 使用 flutter create <projectname ...

  3. Flutter入门之有状态组件

    StatefulComponent使用方法入门 在上一篇Flutter入门之无状态组件中我们讲到了无状态组件,所谓的无状态组件指的就是其内部的状态是来自其父组件并使用final类型的变量来存储,当组件 ...

  4. flutter入门开发的一些坑

    flutter入门开发的一些坑 很久没写博客了,最近在准备物联网比赛,顺便抽出时间学习了一下flutter,花了近2周完成了一个查看博客博文的一个小的APPdemo,随便截了两张图,如下: 首页 博客 ...

  5. flutter 入门(Mac)

    背景 近一年时间都在用 React Native 开发公司的 APP,水平基本上可以说是登堂入室了.前一段时间兴起一阵 Flutter 热,后端的同事都有推荐,今年 Google 大会又推出 flut ...

  6. Flutter入门教程(一)Flutter简介

    这是Flutter系列第一篇文章,后续会持续更新Flutter相关知识,本篇就主要对于Flutter技术做一个简单的入门介绍 一.Flutter简介 Flutter是谷歌的移动UI框架,可以快速在iO ...

  7. Flutter入门

    1.安装SDK 官网下载其最新可用的安装包并解压. 设置环境变量:在.bash_profile文件中写入export PATH=/Users/malk/Documents/flutter/bin:$P ...

  8. 谷歌移动UI框架Flutter入门

    引言 作为Android开发人员,很有必要学习一下Flutter,那么Flutter是什么呢?它到底有什么作用呢?我们一一来揭晓. Flutter是谷歌的移动UI框架,可以快速在iOS和Android ...

  9. Flutter入门(一)

    Flutter的sdk地址https://flutter.dev/docs/development/tools/sdk/releases 如果网络不能翻墙,只需要在环境变量里增加如下 FLUTTER_ ...

随机推荐

  1. Spring cloud微服务安全实战-5-11实现基于token的SSO(1)

    基于服务器session的SSO的方案,用户的登陆状态都是存在服务器端的 基于浏览器cookie的token实现一个sso,在原来的基础上做进一步的改造.让他不依赖session.而是完全由cooki ...

  2. Spring cloud微服务安全实战-5-7实现基于session的SSO(客户端应用的Session有效期)

    授权模式改造成了Authorization code完成了改造的同时也实现了SSO.微服务环境下的前后端分离的单点登陆. 把admin的服务重启.刷新页面 并没有让我去登陆,直接就进入了首页. ord ...

  3. 使用navicat的坑

    小黄人发送数据,测试软件是否将数据存入mysql数据库中,使用的是navicat. 首先截断了表,所有数据清零,但是此时表并没有回到第一页[由于前面查看最新数据,已经翻到了最后一页],然后小黄人发数据 ...

  4. Java EE互联网轻量级框架整合开发— SSM框架(中文版带书签)、原书代码

    Java EE互联网轻量级框架整合开发 第1部分 入门和技术基础 第1章 认识SSM框架和Redis 2 1.1 Spring框架 2 1.2 MyBatis简介 6 1.3 Spring MVC简介 ...

  5. html中的<pre>标签

    定义和用法 pre 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre> 标签的一个常见应用就是用来表示计算机的源代码. ...

  6. 安装kubernet(k8s)

    简介: 需要学习的都明白,这里就不赘述了. 本文采用CentOS-7-x86_64-DVD-1810.iso 一:安装操作系统 本来是喜欢用fedora的,但是fedora貌似包维护的不好,就又开始用 ...

  7. angular2 ng-if

    ng-if <td ><div class="td-li" > <a (click)="open(i)" class=" ...

  8. HTTP权威指南-报文与状态码

    所有的报文都向下流动 报文流向 报文组成 HTTP方法 状态码 GET示例 HEAD示例 100~199 信息性状态码 200~299 成功状态码 300~399重定向状态码 400~499 客户端错 ...

  9. Python数据挖掘之随机森林

    主要是使用随机森林将four列缺失的数据补齐. # fit到RandomForestRegressor之中,n_estimators代表随机森林中的决策树数量 #n_jobs这个参数告诉引擎有多少处理 ...

  10. LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)

    21. 合并两个有序链表 21. Merge Two Sorted Lists 题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. LeetCode ...