从零开始写第一个Flutter app(七)——弹出toast

目录

前言

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 // 字体颜色
    );
  }
}

 

<think>嗯,用户之前问过如何运行代练平台的代码,现在又问怎么制作一个App。看起来他可能对开发应用感兴趣,特别是Web应用,因为之前的回答是基于Flask的。不过现在他想做一个App,可能需要明确是移动应用还是其他类型的应用。 首先,我需要考虑用户可能的背景。之前的对话中,用户接触的是Python和Web开发,所以可能对移动开发不太熟悉。需要解释制作App的不同类型,比如原生、跨平台、Web App,以及他们的优缺点,这样用户可以根据自己的需求选择合适的技术栈。 用户可能没有明确说明是iOS、Android还是跨平台,所以回答需要涵盖各种情况。此外,用户可能关心开发流程、所需技能和工具,以及发布步骤。需要分步骤讲解,从需求分析到设计、开发、测试、发布和维护,每个阶段都给出具体建议。 还要注意用户之前的问题中提到了数据库配置、依赖安装等,所以在开发App时也需要提到后端服务器的搭建,但可能用户这次更关注App本身。不过,如果是需要后端的话,可能需要补充相关内容,比如使用Firebase或自建API。 另外,用户可能需要一些实用工具推荐,比如设计工具Figma、开发工具Android Studio/Xcode、跨平台框架如Flutter或React Native。需要给出具体的学习资源和社区,帮助用户进一步学习。 还要考虑用户可能的资源限制,比如时间和预算,所以推荐跨平台开发可能更适合,节省成本。同时,测试部分要强调不同设备和场景的重要性,确保App的稳定性。 最后,用户可能需要部署和后续维护的建议,比如发布到应用商店、监控和更新。这部分需要简明扼要,但覆盖必要步骤。可能需要提醒用户注意法律问题,比如数据隐私和版权,这在之前的回答中没有提到,但很重要。 总结来说,用户需要的是一个全面的指南,覆盖从零开始制作App的整个流程,包括技术选型、开发步骤、工具推荐和发布维护,同时根据之前的对话,可能需要强调与后端服务的结合,比如使用Python/Flask作为API服务器。需要结构清晰,逐步引导,确保用户能理解每个阶段的任务和所需资源。</think>以下是制作一个App的完整开发指南,涵盖从构思到上线的全流程(以原生Android/iOS开发为例): --- ### **一、开发前准备** #### 1. 明确需求 - 确定核心功能(MVP最小可行产品) - 绘制用户流程图(推荐工具:Figma、Whimsical) - 制作低保真线框图(工具:Balsamiq、Adobe XD) #### 2. 技术选型 | 类型 | 技术方案 | 适用场景 | |------|---------|----------| | 原生开发 | Swift (iOS)/Kotlin (Android) | 高性能、复杂交互 | | 跨平台开发 | Flutter/Dart、React Native | 双平台快速开发 | | 混合开发 | Ionic/Cordova | 简单Web应用封装 | | 小程序 | 微信/支付宝生态 | 轻量级服务 | --- ### **二、开发环境搭建** #### 1. 原生开发环境 - **iOS开发**: - 硬件:Mac电脑(必须) - 工具:Xcode(含iOS模拟器) - 语言:Swift 5+ - **Android开发**: - 工具:Android Studio - 语言:Kotlin 1.8+ - SDK:至少安装API Level 30 #### 2. 跨平台开发(以Flutter为例) ```bash # 安装Flutter SDK git clone https://github.com/flutter/flutter.git export PATH="$PATH:`pwd`/flutter/bin" # 验证安装 flutter doctor ``` --- ### **三、基础架构设计** #### 1. 技术架构分层 ```mermaid graph TD A[UI层] --> B[业务逻辑层] B --> C[数据访问层] C --> D[本地数据库/SQLite] C --> E[网络请求/REST API] ``` #### 2. 常用库推荐 | 功能 | Android库 | iOS库 | 跨平台方案 | |------|----------|-------|-----------| | 网络请求 | Retrofit | Alamofire | Dio | | 数据库 | Room | CoreData | Hive | | 状态管理 | ViewModel | Combine | Provider | | 图片加载 | Glide | Kingfisher | CachedNetworkImage | --- ### **四、核心开发步骤** #### 1. 创建基础界面 - **Android示例(Kotlin)**: ```kotlin class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val button = findViewById<Button>(R.id.myButton) button.setOnClickListener { Toast.makeText(this, "按钮被点击", Toast.LENGTH_SHORT).show() } } } ``` - **iOS示例(Swift)**: ```swift class ViewController: UIViewController { @IBOutlet weak var myLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() myLabel.text = "欢迎使用" } } ``` #### 2. 数据持久化 ```dart // Flutter使用Hive示例 var box = await Hive.openBox('myBox'); box.put('name', 'David'); print('存储的值:${box.get('name')}'); ``` #### 3. 网络通信 ```javascript // React Native使用Axios示例 axios.post('https://api.example.com/login', { username: 'user', password: 'pass' }) .then(response => { console.log(response.data); }); ``` --- ### **五、测试与调试** 1. **单元测试**(JUnit/ XCTest) 2. **UI自动化测试**(Espresso/ XCUITest) 3. **真机调试技巧**: - Android:开启USB调试模式 - iOS:配置开发者证书 4. **性能优化工具**: - Android Profiler - Instruments(iOS) --- ### **六、发布准备** #### 1. 应用商店要求 | 平台 | 准备材料 | 审核时间 | 费用 | |------|---------|----------|-----| | Google Play | 512x512图标<br>屏幕截图<br>隐私政策 | 1-3天 | $25一次性 | | App Store | 所有尺寸截图<br>应用预览视频<br>测试账号 | 1-7天 | $99/年 | #### 2. 构建发布版本 - Android生成APK/AAB: ```bash ./gradlew assembleRelease ``` - iOS打包流程: 1. Xcode选择Generic iOS Device 2. Product > Archive 3. 导出IPA文件 --- ### **持续维护** 1. **错误监控**(Firebase Crashlytics/Sentry) 2. **热更新方案**: - Android:Play Core Library - iOS:JSPatch(需企业证书) 3. **用户反馈系统**集成(如Intercom) --- ### **学习资源推荐** 1. 官方文档: - [Android开发者文档](https://developer.android.com/) - [Apple开发者门户](https://developer.apple.com/) 2. 免费课程: - Udacity《Android基础》 - Stanford iOS开发公开课 3. 社区: - Stack Overflow - GitHub开源项目 --- ### **避坑指南** 1. 内存泄漏检测: - Android:LeakCanary - iOS:Xcode Memory Debugger 2. 多语言适配: - 使用strings.xml(Android) - Localizable.strings(iOS) 3. 屏幕适配方案: - Android:ConstraintLayout + 多尺寸资源 - iOS:Auto Layout + Size Classes --- 实际开发建议: 1. 从简单项目开始(如Todo List应用) 2. 使用Git进行版本控制(推荐GitHub私有仓库) 3. 关注Material Design/iOS HIG设计规范 4. 定期备份项目代码和证书文件 如果需要具体某个技术栈的详细教程,可以告知您更聚焦的方向(如游戏开发、电商应用等)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值