前言

Android原生开发中有Toast这一控件,在提示简短信息和调试的时候都非常好用。但是Flutter是一套全新的UI框架,目前是没有Toast支持的。不过没关系,我们可以自己实现一个,也可以用别人已经实现的第三方包,今天我们就介绍下如何用第三方包实现Toast消息弹出。

实现

1.首先在pubspec.yaml配置文件中添加相关包的依赖,然后点击Packeage get按钮下载依赖

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
  english_words: ^3.1.0
  fluttertoast: ^2.1.1  // 新增Toast包

2.然后在lib/main.dart文件中导入fluttertoast.dart

import 'package:fluttertoast/fluttertoast.dart';

3.最后调用fluttertoast提供的功能弹出toast

由于toast功能比较常用,所以我们先定义一个共用的方法void toast(String txt),传入txt参数就可以打印toast,Fluttertoast.showToas()方法各个参数的使用方法见如下代码注释

void toast(String txt) {
  Fluttertoast.showToast(
      msg: txt, // 显示的内容
      toastLength: Toast.LENGTH_SHORT, // 显示时长,与原生Toast一样可设置LENGTH_SHORT或者LENGTH_LONG
      gravity: ToastGravity.BOTTOM, // 显示位置,支持TOP, BOTTOM, CENTER三种位置
      timeInSecForIos: 1,
      backgroundColor: Colors.black, // 背景颜色
      fontSize: 16, // 字体大小
      textColor: Colors.white // 字体颜色
  );
}

然后修改_buildRow()方法中ListTile的onTap属性的代码,在点击的时候弹toast,具体代码如下所示

onTap: () {      // Add 9 lines from here...
  setState(() {
    if (alreadySaved) {
      _saved.remove(pair);
      toast("选择:" + pair.asPascalCase);
    } else {
      _saved.add(pair);
      toast("取消:" + pair.asPascalCase);
    }
  });
},

本节最终代码

本节最终的lib/main.dart可运行的代码如下所示

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';
import 'package:fluttertoast/fluttertoast.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Startup Name Generator',
      home: RandomWords(),
    );
  }
}

class RandomWords extends StatefulWidget {
  @override
  RandomWordsState createState() => new RandomWordsState();
}

class RandomWordsState extends State<RandomWords> {
  final _suggestions = <WordPair>[]; // ListView用的数据源
  final _biggerFont = const TextStyle(fontSize: 18.0); // 字体大小
  final Set<WordPair> _saved = Set<WordPair>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Startup Name Generator'),
      ),
      body: _buildSuggestions(), // body为一个ListView
    );
  }

  Widget _buildSuggestions() {
    return ListView.builder(
        padding: const EdgeInsets.all(16.0), // 设置padding
        itemBuilder: (context, i) {
          if (i.isOdd) return Divider(); // 如果为基数,返回分割线

          final index = i ~/ 2; // 由于divider也占一个位置,所以需除以2计算实际的index
          // 若数据源不够,则一次性生成10条数据,这样就可以实现ListView无限滑动的效果
          if (index >= _suggestions.length) {
            _suggestions.addAll(generateWordPairs().take(10));
          }
          // 生成每一条item布局
          return _buildRow(_suggestions[index]);
        });
  }

  // 创建ListView的Item
  Widget _buildRow(WordPair pair) {
    final bool alreadySaved = _saved.contains(pair);
    return ListTile(
      title: Text(
        pair.asPascalCase,
        style: _biggerFont, // 设置样式字体大小
      ),
      trailing: Icon(   // Add the lines from here...
        alreadySaved ? Icons.favorite : Icons.favorite_border,
        color: alreadySaved ? Colors.red : null,
      ),
      onTap: () {      // Add 9 lines from here...
        setState(() {
          if (alreadySaved) {
            _saved.remove(pair);
            toast("选择:" + pair.asPascalCase);
          } else {
            _saved.add(pair);
            toast("取消:" + pair.asPascalCase);
          }
        });
      },
    );
  }

  void toast(String txt) {
    Fluttertoast.showToast(
        msg: txt, // 显示的内容
        toastLength: Toast.LENGTH_SHORT, // 显示时长,与原生Toast一样可设置LENGTH_SHORT或者LENGTH_LONG
        gravity: ToastGravity.BOTTOM, // 显示位置,支持TOP, BOTTOM, CENTER三种位置
        timeInSecForIos: 1,
        backgroundColor: Colors.black, // 背景颜色
        fontSize: 16, // 字体大小
        textColor: Colors.white // 字体颜色
    );
  }
}