• 105434

    文章

  • 803

    评论

  • 12

    友链

  • 比来新加了换肤功能,大年夜家多来走走吧~~~~
  • 爱好这个网站的同伙可以加一下QQ群,我们一路交换技巧。

入坑Flutter ,弃坑React-Native(简单体验)

撸了本年阿里、腾讯和美团的面试,我有一个重要发明.......>>
媒介

由于营业须要之前用react-native重写了公司项目,中心碰着各类坑,莫明其妙红屏,适配坑,页面刷新坑,打包坑,热更新坑.熬煎了两个月终究完成.岁首年代就听说了Flutter,看一下是用Google的Dart说话,听说是有望代替JavaScript这个一周完成的奇葩.咳咳,看了下国际咸鱼团队曾经在项目中应用了Flutter技巧,这是他们的社区社区博文深刻懂得flutter的编译道理与优化,想不到居然如此强大年夜.不由得就参考官方文档写了个demo

Flutter官网

https://flutter.io/get-started/install/

克隆Flutter仓库

git clone -b beta https://github.com/flutter/flutter.git

设备情况变量

export PUB_HOSTED_URL=https://pub.flutter-io.cn //国际用户须要设置
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn //国际用户须要设置
export PATH= flutter地点目次/flutter/bin:$PATH

可直接将情况变量写入~/.bash_profile文件中履行source $HOME/.bash_profile失效(假设未失效请重启终端或电脑)

设备敕令行对象sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

装置链接设备对象

brew update
brew install --HEAD libimobiledevice
brew install ideviceinstaller ios-deploy cocoapods
pod setup

VScode 设备

搜刮dart code装置dart 插件

image

快捷键 shift + command + p 输入 ‘doctor’, 然后选择 ‘Flutter: Run Flutter Doctor’ 验证操作 image

异样 shift + command + p 输入 ‘flutter’, 然后选择 ‘Flutter: New Project’ action 创建一个测试项目 vscode 底部展示附加设备 image

点击Debug>Start Debugging便可运转项目

image

image

创建

按照之前的办法创建一个模板 shift + command + p 输入 ‘flutter’, 然后选择 ‘Flutter: New Project’ action

调换 lib/main.dart. 删除lib / main.dart中的一切代码,然后调换为下面的代码,它将在屏幕的中间显示“Hello World”

//应用出口 
//main函数应用了(=>)符号, 这是Dart中单行函数或办法的简写
void main() => runApp(new DemoApp());

class DemoApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    
    return new MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Welcome to Flutter'),
        ),
        body: new Center(
          child: new Text('Royce and Owen'),
        ),
      ),
      
    );
  }
}

外部包应用

  • 您可以 在pub.dartlang.org上找到english_words软件包和其他很多开源软件包 image
  • 将english_words添加到pubspec.yaml文件中(pubspec文件
  • 管理Flutter应用法式榜样的assets(资本,如图片、package等)) image
  • 在终端中运转flutter packages get装置依附
flutter packages get
Running "flutter packages get" in startup_first...           0.6s
  • 导入import 'package:english_words/english_words.dart';
  • 应用 English words 包生成文本来调换字符串“Hello World”.
  • 修改代码
class DemoApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final wordPair = new WordPair.random();
    return new MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Welcome to Flutter'),
        ),
        body: new Center(
          child: new Text(wordPair.asUpperCase),
        ),
      ),
      
    );
  }
}

添加一个 有状况的部件(Stateful widget)

Stateless widgets 是弗成变的, 这意味着它们的属性不克不及改变 - 一切的值都是终究的.

Stateful widgets 持有的状况能够在widget生命周期中产生变更. 完成一个 stateful widget 至少须要两个类:

  1. 一个 StatefulWidget类。
  2. 一个 State类。 StatefulWidget类本身是不变的,然则 State类在widget生命周期中一直存在.
  • 新建一个组件类RandomWords
  • 新建一个State组件类RandomWordsState
class RandomWordsState extends State<RandomWords> {
  @override
  Widget build(BuildContext context) {
    final wordPair = new WordPair.random();
    return new Text(wordPair.asPascalCase);
  }
}
class RandomWords extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
      // TODO: implement createState
      return new RandomWordsState();
    }
}
  • 修改代码 final wordPair = new WordPair.random(); // 删除此行

class DemoApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
   
    return new MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Welcome to Flutter'),
        ),
        body: new Center(
          child: new RandomWords(),
        ),
      ),
      
    );
  }
}

创建一个无穷转动ListView

扩大(持续)RandomWordsState类,以生成并显示单词对列表。 当用户转动时,ListView中显示的列表将无穷增长

  1. 在RandomWordsState添加一个变量_suggestions(下划线前缀标识符,会强迫其变成私有的)
  2. 添加一个_biggerFont变量来孔子字体大年夜小
  3. 新建_buildSuggestions()办法 显示建议的单词对
  4. 在RandomWordsState中添加一个_buildRow函数
  5. 更新RandomWordsState的build办法以应用_buildSuggestions()
  6. 更新MyApp的build办法
class RandomWords extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return new RandomWordsState();
  }
}
class RandomWordsState extends State<RandomWords> {
  final _suggestions = <WordPair>[];
  final _biggerFont =
      const TextStyle(fontSize: 18.0, color: Color.fromARGB(1, 234, 111, 22));

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text('StartUp'),
        ),
        body: _buildSuggestions());
  }

  Widget _buildSuggestions() {
    return new ListView.builder(
        padding: const EdgeInsets.all(16.0),
        // 关于每个建议的单词对都邑调用一次itemBuilder,然后将单词对添加到ListTile行中
        // 在偶数行,该函数会为单词对添加一个ListTile row.
        // 在奇数行,该行书湖添加一个瓜分线widget,来分隔相邻的词对。
        // 留意,在小屏幕上,瓜分线看起来能够比较费力。
        itemBuilder: (context, i) {
          // 在每列之前,添加一个1像素高的分隔线widget
          if (i.isOdd) return new Divider();
          // 语法 "i ~/ 2" 表示i除以2,但前往值是整形(向下取整),比如i为:1, 2, 3, 4, 5
          // 时,成果为0, 1, 1, 2, 2, 这可以计算出ListView中减去分隔线后的实际单词对数量
          final index = i ~/ 2;
          if (index >= _suggestions.length) {
            _suggestions.addAll(generateWordPairs().take(10));
          }
          return _buildRow(_suggestions[index]);
        });
  }

  Widget _buildRow(WordPair pair) {
    return new ListTile(
      title: new Text(
        pair.asPascalCase,
        style: _biggerFont,
      ),
    );
  }
}

添加交互

  1. 添加一个 _saved Set(集合) 到RandomWordsState。这个集合存储用户爱好(收藏)的单词对
  2. 在 _buildRow 办法中添加 alreadySaved来检查确保单词对还没有添加到收藏夹中。
  3. 同时在 _buildRow()中, 添加一个心形 ❤️ 图标到 ListTiles以启用收藏功能
  4. 在 _buildRow中让心形❤️图标变得可以点击。假设单词条目曾经添加到收藏夹中, 再次点击它将其从收藏夹中删除。当心形❤️图标被点击时,函数调用setState()告诉框架状况曾经改变。
Widget _buildRow(WordPair pair) {
    //断定能否收藏
    final bool alreadySaved = _saved.contains(pair);
    return new ListTile(
      title: new Text(
        pair.asPascalCase,
        style: _biggerFont,
      ),
      subtitle: new Text('哈哈哈'),
      trailing: new Icon(
        alreadySaved ? Icons.favorite : Icons.favorite_border,
        color: alreadySaved ? Colors.red : null,
      ),
      onTap: () {
        setState(() {
          if (alreadySaved) {
            _saved.remove(pair);
          } else {
            _saved.add(pair);
          }
        });
      },
    );
  }

导航到新页面

在Flutter中,导航器管理应用法式榜样的路由栈。将路由推入(push)到导航器的栈中,将会显示更新为该路由页面。 从导航器的栈中弹出(pop)路由,将显示前往到前一个路由。这点类似iOS的导航机制

  1. 给AppBar的actions属性添加一个按钮子组件,由因而双数用 <Widget>[]包装
  2. 当用户点击导航栏中的列表图标时,建立一个路由并将其推入到导航管理器栈中。此操作会切换页面以显示新路由在MaterialPageRoute的builder属性中构建,builder是一个匿名函数。
 @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
        actions: <Widget>[
          new IconButton(icon: new Icon(Icons.list), onPressed: _pushSaved)
        ],
          title: new Text('嘿嘿嘿',
              style: const TextStyle(
                  fontSize: 18.0, color: Color.fromRGBO(150, 22, 123, 1.0))),
        ),
        body: _buildSuggestions());
  }
  void _pushSaved() {
    Navigator.of(context).push(new MaterialPageRoute(builder: (context) {
      //便利以保存的单词 创建tile 或许叫(cell,item)
      final tiles = _saved.map((pair) {
        return new ListTile(
          title: new Text(
            pair.asPascalCase,
            style: _biggerFont,
          ),
        );
      });
      final divided =
          ListTile.divideTiles(context: context, tiles: tiles).toList();
          //前往一个新页面
      return new Scaffold(
        appBar: new AppBar(
          title: new Text('saved Suggestions'),
        ),
        body: new ListView(children: divided),
      );
    }));
  }

后果

image

image

应用主题更改UI

创建ThemeData来定义theme

class DemoApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Startup Name Generator',
      //主题
      theme: new ThemeData(
        primaryColor: Colors.orange,
      ),
      home: new RandomWords(),
    );
  }
}

ThemeData供给相当多的属性,自定义程度相当高了,不愧是基于OpenGL构建的UI,比起RN自在度高了很多
Material library中的 Colors类也供给了很多可以应用的色彩常量例如Colors.green,Color.fromRGBO(255, 111, 233, 1.0)

部分属性简介
accentColor → Color 控件的前风景(旋钮、文本、覆盖边沿后果等)。
accentColorBrightness → Brightness 
dividerColor → Color 分隔符和弹窗分隔符的色彩,也用于ListTiles和DataTables的行之间
primaryColor → Color 应用法式榜样重要部分的背景色彩(对象栏,标签栏等)

以上第一flutterdemo完成.
Dart语法异常类似JS,比拟较RN但少了</>加倍易懂,拥类似state状况机,热加载速度很快,C++底层,基于OpenGL,强大年夜的API和文档支撑.

代码地址https://gitee.com/Royce_he/flutter_demo


695856371Web网页设计师②群 | 爱好本站的同伙可以收藏本站,或许参加我们大年夜家一路来交换技巧!

8条评论

Loading...


自定义皮肤 主体内容背景
翻开付出宝扫码付款购买视频教程
碰到成绩接洽客服QQ:419400980
注册梁钟霖小我博客