Flutter开发遇到的一些常见的问题(持续更新)

  1. 当你遇到界面上键盘弹起时却遮盖布局,或者弹起时布局发生变化。

在这里插入图片描述加上该属性 resizeToAvoidBottomPadding: false

  1. dart中用来计算 例如10的-6次方该怎么写
    首先引入 import ‘dart:math’;
    pow(10, -6) 注意返回的是一个num,需要toDouble();

  2. 做Android的同学都知道,当你用完一个controller,要记得注销掉
    @override
    void dispose() {
    _textEditingController.dispose();
    super.dispose();
    }

  3. 界面延迟加载可以用FutureBuilder

  4. dart中list也可以进行排序
    list.sort((a,b) => a.sBaseCode.compareTo(b.sBaseCode));
    排序完之后打乱 list.shuffle()

  5. widget之间传值
    1可以用构造方法
    MarketList _marketList;
    SecondPageMyItem(this._marketList);
    2也可以用接口
    typedef OnChanged(double num);

  6. 监听不同widget数据变化可以用 eventbus,是的dart支持!!!

  7. IndexedStack相当于Android的一个Fragment,缺点是会提前加载,必要的情况下可以用pageview代替

  8. physics: NeverScrollableScrollPhysics()禁止滑动

  9. Listview嵌套Listview时,里面的Listview内容显示不全
    加上shrinkWrap: true, //为true可以解决子控件必须设置高度的问题

  10. toStringAsFixed(2),小数点后精确到2位

  11. 未完待续。。。


  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

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

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

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

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

  5. 解决类冲突的问题,比如,我自定义一个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: [
ArticlesPage(),
ProjectPage(),
NavigationPage(),
CollectionArticlesPage(),
],
onPageChanged: changePage,
),
bottomNavigationBar: Navigations(_page, changePage));
}

//然后在子Page的State分别实现with AutomaticKeepAliveClientMixin,wantkeepAlive返回true

class ArticlesPageState extends State with AutomaticKeepAliveClientMixin{
@override
bool get wantKeepAlive => true;
}

class ProjectPageState extends State with AutomaticKeepAliveClientMixin{
@override
bool get wantKeepAlive => true;
}

class NavigationPageState extends State with AutomaticKeepAliveClientMixin{
@override
bool get wantKeepAlive => true;
}

class CollectionArticlesPageState extends State 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"?>
<!-- You can insert your own image assets here -->
<!-- <item>
    <bitmap
        android:gravity="center"
        android:src="@mipmap/launch_image" />
</item> -->
将注释去掉,替换为自己的launcher_image即可 。
  1. 界面存在输入框的时候,点击后软键盘将页面顶起来导致页面重绘的问题(Android fitsystem),可以通过将Scaffold的resizeToAvoidBottomPadding属性设置为false来关闭重绘,如下:

return Scaffold(
resizeToAvoidBottomPadding: false,
);
12. 修改TextFiled的边界宽度,可以通过decoration的contentPadding属性进行修改,如下:

return TextField(
decoration: InputDecoration(
contentPadding: EdgeInsets.all(8),
),
);
13. 如果想实现一个布局,在某些条件下显示,可以采用Offstage布局,动态控制其offstage属性值即可

  1. 如果出现弹出输入法的时候导致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的值来进行宽高的修改,该值代表宽:高

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

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

GridView.count(
physics: NeverScrollableScrollPhysics(),
);
18. flutter隐藏状态栏,使用:

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

WidgetsBinding.instance.addPostFrameCallback((callback){
  print("complete");
});
  1. 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

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

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

  3. 裁剪图片的方法:

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 gNavigatorKey = new GlobalKey();
b. 在MaterialApp初始化的时候使用

return MaterialApp(
navigatorKey: Global.gNavigatorKey,
routes: <String, WidgetBuilder> {
‘/login’: (BuildContext context) => new LoginPage(),
},
//…代码省略
c. 需要的地方使用:

Global.gNavigatorKey.currentState.pushNamedAndRemoveUntil(’/login’,(_) => false);
注意的是这种方法代价比较大,除非特殊情况,否则不建议使用。使用的时候根据不同的场景调用不同的push方法

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

以上原文链接:https://blog.csdn.net/email_jade/article/details/85317859

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Flutter开发文档是针对Flutter框架的官方文档,提供了全面的开发指南和参考资料。它包括了Flutter框架的概述,安装和配置指南,以及各种用于构建高性能跨平台应用的工具和资源。 首先,Flutter开发文档介绍了Flutter框架的基本概念和原理,包括如何使用Widget构建用户界面以及如何处理用户输入和交互。开发者可以通过这些指南来了解Flutter的整体架构和核心特性,从而更好地理解和利用Flutter进行应用开发。 其次,Flutter开发文档提供了丰富的API参考和使用示例,使开发者能够快速上手和深入了解各种Flutter组件和功能。开发者可以通过文档中的代码示例和详细说明来学习如何使用不同的Widget和布局进行界面设计,以及如何调用Flutter提供的各种API实现更复杂的业务逻辑。 此外,Flutter开发文档还详细介绍了Flutter开发工具和调试技巧,包括如何使用命令行工具进行项目管理和发布,如何使用集成开发环境(IDE)进行开发和调试,以及如何使用Flutter的调试工具来定位和解决应用中的问题。这些指南和建议可以帮助开发者提高开发效率,减少错误和调试时间。 总之,Flutter开发文档是学习和使用Flutter进行应用开发的重要参考资料。它提供了全面的开发指南和参考资料,帮助开发者快速上手和精通Flutter开发,实现高性能、跨平台的应用程序。对于初学者来说,阅读Flutter开发文档是入门的首要步骤,对于有经验的开发者来说,它是进一步提升技能和应用开发水平的宝贵资源。 ### 回答2: Flutter是Google推出的一种用于构建跨平台移动应用的开源框架。它具有快速开发、高效性能和灵活可扩展等特Flutter开发文档非常详细全面,为开发者提供了丰富的资源和指导。 首先,Flutter开发文档提供了完整的安装指南,让开发者能够快速搭建开发环境,并且支持多个操作系统,包括Windows、MacOS和Linux等。开发者只需按照文档中的步骤进行配置,即可开始使用Flutter进行开发。 其次,Flutter开发文档提供了丰富的基础知识和概念介绍,帮助开发者了解Flutter的整体架构和工作原理。文档中详细介绍了Flutter的Widget系统,以及如何使用Widget来构建用户界面。此外,文档还提供了许多关于布局、动画和主题等方面的教程和示例代码,帮助开发者快速上手。 另外,Flutter开发文档还包含了大量的API文档,涵盖了Flutter框架的核心功能和各种组件的使用方法。开发者可以根据需要查阅相应的API文档,了解每个组件的属性、方法和事件等详情。同时,文档还提供了一系列示例代码,让开发者能够更好地理解和运用这些组件。 最后,Flutter开发文档还提供了丰富的实用资源和工具,包括开发工具的介绍和配置、Flutter包管理和依赖管理等。开发者可以通过文档中提供的链接和教程,快速了解和使用这些工具,提高开发效率。 总的来说,Flutter开发文档对于开发者来说是非常宝贵的资源,通过详细的介绍和实用的示例,帮助开发者快速入门和深入理解Flutter框架,从而能够更高效地开发出跨平台的移动应用。 ### 回答3: Flutter开发文档是Flutter官方提供的一份详尽的技术文档,用于指导Flutter开发学习和使用Flutter框架。文档详细地介绍了Flutter的各个方面,包括安装配置、基本概念、核心组件、布局系统、用户界面、动画、手势、插件等内容。 首先,文档提供了Flutter的安装配置指南,指导开发者如何搭建开发环境,并使用Flutter SDK进行应用开发。同时,文档还介绍了Flutter的基本概念和工作原理,帮助开发者理解Flutter的核心特性和优势。 其次,文档详细介绍了Flutter的核心组件,包括Widget、State、BuildContext等,开发者可以了解到如何使用这些组件构建复杂的用户界面。同时,文档还深入介绍了Flutter的布局系统,包括Row、Column、Stack等布局组件的用法,并提供了示例代码和案例说明。 此外,文档还介绍了Flutter的用户界面设计,包括样式、字体、图片等的使用方法,以及界面的响应事件和动画效果的实现。开发者可以通过文档了解到如何构建出令人满意的用户界面和用户交互效果。 最后,文档还提供了Flutter插件的开发方法和使用指南,通过插件可以扩展Flutter的功能和接入原生平台的特性,帮助开发者实现更复杂的应用需求。 总而言之,Flutter开发文档是一份权威且详细的技术指南,对于Flutter开发者来说是不可或缺的参考材料。通过学习和使用文档中的知识,开发者可以更加高效地进行Flutter应用的开发和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值