Flutter调研(3)-demo编写与小结

一个demo

一、关于Dart语言

在查看代码之前,首先我们来了解下Dart语言,Flutter在应用层使用Dart进行开发,而支撑它的是用C++开发的引擎

Dart的设计综合借鉴了Java和JavaScript,在静态语法方面与Java相似,如类型定义、函数声明和泛型等,在动态特性上比如函数式特性、异步支持。

  • Dart是一种面向对象的语言
  • Dart是一种强类型语言
  • Dart有GC机制
  • Dart在运行之前会先解析代码
  • Dart中,Object类是所有对象的根基类
  • Dart的异步支持基于类似于JS的“Future返回结果”和“async 方法和 await 表达式”
  • Dart没有作用域关键字,如果标识符以_开头表示该方法或者属性为类私有
  • Dart是单线程的

二、关于Widget

Flutter Widget采用现代响应式框架构建,中心思想是用widget构建你的UI。

Widget可以译为组件之类的,描述当前视图在当前的配置和状态时的展示形态,当Widget的状态发生改变时,UI会被重新构建,Flutter会对比前后变化的不同,以确定底层渲染树从一个状态转换到下一个状态所需的最小更改;这个思路和React有一定相似。

基于以上,那么就有两个父类,无状态的StatelessWidget和有状态的StatefulWidget,这两个抽象类时直接集成自Widget类,日常使用中比较常用。

  • StatelessWidget用于不需要维护状态的场景,无状态组件不可变,通过build方法构建页面;
  • StatefulWidget用于有状态变化的场景,createState() 用于创建与Stateful widget对应的一个继承State类的子类,在State类中调用build方法构建页面

三、代码:demo

// main.dart
import ‘package:flutter/material.dart‘; //导入Material的UI组件库,来自谷歌,使展示更鲜明
import ‘home.dart‘;

void main() => runApp(MyApp());// 程序的入口,调用runApp()启动程序, "=>"是单行方法的简写

class MyApp extends StatelessWidget {
  // MyApp是一个继承于无状态statelessWidget的类
  @override
  Widget build(BuildContext context) {//调用build方法构建UI界面
    return MaterialApp( // 代表Material设计风格的应用,也是一个Widget,可定义应用名称,主题,首页
      title: ‘Flutter Demo mfw‘,// 任务管理窗口所展示的应用名称
      theme: ThemeData( //应用的主题颜色
        primarySwatch: Colors.blue,
      ),
      home: Home(title: ‘Flutter Demo Home Page‘),//应用默认所要展示的界面
    );
  }
}

// home.dart:一个计数器,三个跳转路由
class Home extends StatefulWidget {
  Home({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  int _counter = 0;

  void _incrementCounter() {// 监控按钮的增加数值方法
    setState(() {//通知Flutter框架有状态改变,Flutter框架收到通知后,会执行build方法重新构建界面
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(

        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              ‘You have clicked the button this many times:‘,
            ),
            Text(
              ‘$_counter‘,
              style: Theme.of(context).textTheme.display1,
            ),

            FlatButton(
              child: Text("open new case1"),
              textColor: Colors.blue,
              onPressed: (){
                Navigator.push( context,
                    MaterialPageRoute(builder: (context){
                      return NewRoute();
                    }));
              },
            ),

          FlatButton(
            child: Text("open new case2"),
           textColor: Colors.blue,
           onPressed: (){
              Navigator.push( context,
            MaterialPageRoute(builder: (context){
              return NewRoute1();
            }));
      },
    ),

          FlatButton(
          child: Text("open new case3"),
      textColor: Colors.blue,
      onPressed: (){
        Navigator.push( context,
            MaterialPageRoute(builder: (context){
              return Route3();
            }));
      },
    )

          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: ‘Increment‘,
        child: Icon(Icons.add),
      ),
    );
  }
}

一个小结

一、测试期间可能遇到的问题

1、Widget嵌套可能导致的问题

2、由于单线程机制,Flutter本身不会导致crash,会卡顿

3、UI溢出的报错,提示overflow

4、由于状态管理有些笨重,动画效果的实现需要注意

5、原生与flutter之间的互相跳转需要注意,与原生权限获取时是否有问题

二、code方面的简单总结

// 每个widget继承自StatelessWidget或者StatefuleWidegt
// statelessWidget状态变化不大,statefulWidget分成两个,一个有build构建方法,一个继承自state类
// 一个标准statelessWidget的Widget构建过程如下
class  TestWidget extends StatelessWidegt{
@override
Widget build(BuildContext context){// build页面
return 控件名(
xxxx(child:内嵌其他控件
),
.....
)
}
};
// 那么一个statefulWidget的构建过程
class Test extends StatefulWideget{
Route3({Key key}) : super(key: key);
@override
_TestState createState() => _TestState();  //新建state类
}

class _Route3State  extends State(Test){
@override
Widget build(BuildContext context)// 在state类里build页面
....
}

三、讲解问题记录

1、flutter实现跨平台的原理是什么

Flutter跨平台最核心的部分,是它的高性能渲染引擎(Flutter Engine)。Flutter不使用浏览器技术,也不使用Native的原生控件,它使用自己的渲染引擎来绘制widget。

对于Android平台,Flutter引擎的C/C++代码是由NDK编译,在iOS平台,则是由LLVM编译,两个平台的Dart代码都是AOT编译为本地代码,Flutter应用程序使用本机指令集运行。

Flutter正是是通过使用相同的渲染器、框架和一组widget,来同时构建iOS和Android应用,而无需维护两套独立的代码库。

2、flutter的性能如何

通过资料查询,原生在内存和CPU资源等性能方面,原生是要优于flutter的,flutter本身最大特点还是在于跨平台

参考:

flutter中文网

flutter官网docs

原文地址:https://www.cnblogs.com/zhuwf/p/12390143.html

时间: 2024-10-18 00:35:34

Flutter调研(3)-demo编写与小结的相关文章

android JNI 简单demo(2)之JNI demo 编写

android JNI 简单demo(2)之JNI demo 编写 一.搭建Cygwin 环境:http://blog.csdn.net/androidolblog/article/details/25559013 二.JNI 基本要素: 1.编写 含native 方法的java文件. 2.把该文件用javah 生成 Cygwin 编译库时要用到的头文件,既*.h 文件. 3.编写*.c 文件,在*.c文件中,实现 *.h 中的方法. 4.编写mk文件. 5.配置NDK环境. 6.用Cygwin

1 storm基本概念 + storm编程规范及demo编写

本博文的主要内容有 .Storm的单机模式安装 .Storm的分布式安装(3节点)   .No space left on device .storm工程的eclipse的java编写 http://storm.apache.org/ 分布式的一个计算系统,但是跟mr不一样,就是实时的,实时的跟Mr离线批处理不一样. 离线mr主要是做数据挖掘.数据分析.数据统计和br分析. Storm,主要是在线的业务系统.数据像水一样,源源不断的来,然后,在流动的过程中啊,就要把数据处理完.比如说,一些解析,

一个简单的代码计算行数demo编写

最近手头的项目基本上已经完结,历经了5个月的开发和迭代,各种的需求调整,想对自己的代码量进行一个客观的计算,于是抽了点时间写下了这个小demo,朋友们有需要的可以看看,很简单. 基本的思想就是:根目录->递归的遍历所有文件夹>计算具体某一文件的代码行数 具体流程如下: #pragma mark---------------------->递归文件夹下文件 - (void)recordFilePathWithPath:(NSString *)path{ /*        文件管理器  

jquery插件编写学习小结

编写插件的目的是给已经有的一系列方法或函数做一个封装,以便在其他地方重复使用,方便后期维护和提高开发效率. 一.插件的种类 jQuery的插件主要分为3种类型. 1.封装对象方法的插件 2.封装全局函数的插件 3.选择器插件 这里我们主要讨论第一种插件的开发流程. 封装对象方法的插件: 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的一种插件,有95%以上的插件都是这种类型的插件. 二.插件的基本要点 1.所有对象方法都应当附加到jQuery.fn上,而所

如何参考Ogre SDK deferredshading demo 编写对已生成的灯光进行延迟渲染

http://baozoumanhua.com/users/17402312/forum_articleshttp://baozoumanhua.com/users/17402312/followingshttp://baozoumanhua.com/users/17402312/talkingshttp://baozoumanhua.com/users/17402312/following_articleshttp://baozoumanhua.com/users/17402312/artic

Flutter 即学即用系列博客——02 一个纯 Flutter Demo 说明

前言 上一篇文章我们搭建好了 Flutter 的开发环境. Flutter 即学即用--01 环境搭建 这一篇我们通过 Flutter 的一个 Demo 来了解下 Flutter. 开发系统:MAC IDE:Android Studio 目录 1. 创建一个 Flutter 项目 第一步:主界面点击创建 Flutter 项目 第一步:如果已经打开项目,则通过 File->New->New Flutter Project... 创建 第二步:默认选择 Flutter Application 即可

Flutter 不一样的跨平台解决方案

本文主要介绍Flutter相关的东西,包括Fuchsia.Dart.Flutter特性.安装以及整体架构等内容. 1. 简介 Flutter作为谷歌最近推出的跨平台开发框架,一经推出便吸引了不少注意.关于Flutter,目前我们知道它是一个跨平台开发框架.但是它本身并不止于此,例如Fuchsia.Dart等,我们也都需要去了解. 1.1 Fuchsia 说到Flutter,绝对绕不开Fuchsia,这个是谷歌开发的一款全新的操作系统,GitHub地址以及Google source主页.Fuchs

你是否还记得?那些年我们一起追过的(FIDL:Flutter界的AIDL)

前言 大家好!今天给大家安利一个自认为比较重磅的Flutter开源项目. Flutter的产品定义是一个高性能的跨平台的移动UI框架,能够用一套代码同时构建出Android/iOS/Web/MacOS应用.作为一套UI框架,它不具备一些系统的接口,自然还是避免不了跟原生打交道.于是乎,它提出了名为platform channel的东西,用于flutter和原生灵活的交换数据.以下为了描述方便,用Android代指原生. 燃鹅,燃鹅,燃鹅 ,它只支持一些基础的数据类型和数据结构的传输,例如bool

Android自动化问题小结

Android 自动化case小结: 1.jenkins  job  运行   Android 自动化case     出现 com.meilishuo.testcase.profile.AlbumShare:INSTRUMENTATION_RESULT: shortMsg=keyDispatchingTimedOutINSTRUMENTATION_RESULT: longMsg=Timed out while dispatching key eventINSTRUMENTATION_CODE: