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

mryangjx 2020-03-01

一个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

相关推荐