Android Toast通知可用于向用户发送快速消息,并在几秒钟后消失。

但是当涉及Flutter时,没有直接的方式来显示这些Toast消息。因此,我们需要找到一种替代方法来实现它。在这种情况下,platform将是您的朋友。

lib/main.dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
} class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
} class _HomePageState extends State<HomePage> {
/// 创建一个MethodChannel类的对象
static const platform = const MethodChannel("toast.flutter.io/toast");
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'This is Toast Tutorial',
)
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _showToast,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
} void _showToast() {
/// 将唯一的通道名称传递给构造函数。此通道名称用于唯一标识每个通道。
platform.invokeMethod("showToast", {"message": "xxxxx"});
}
}

android/app/src/main/java/com/example/flutter_toast/MainActivity.java

package com.example.flutter_toast;

import android.os.Bundle;
import android.widget.Toast; import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant; import java.util.Map; public class MainActivity extends FlutterActivity {
// 创建一个变量来分配通道名称, 在这里,我们需要使用我们在flutter代码中指定的相同通道名称。
private static final String CHANNEL = "toast.flutter.io/toast"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this); // 需要创建一个新的MethodChannel对象
// 作为构造函数的第二个参数,我们需要传递通道名称
// 当我们从flutter中调用invokeMethod时,方法调用处理程序将调用
new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(new MethodChannel.MethodCallHandler() { // 在onMethodCall里面,我们需要检查哪个方法。因为我们可以通过单一平台渠道调用多种方法
@Override
public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
if (methodCall.method.equals("showToast")) {
// 检查参数
if (!(methodCall.arguments instanceof Map)) {
throw new IllegalArgumentException("Map argument expected");
}
System.out.println(methodCall.arguments);
Toast.makeText(getApplicationContext(), (String) methodCall.argument("message"), Toast.LENGTH_SHORT).show();
} else {
result.notImplemented();
}
}
});
}
}

Flutter 1.14.2 创建插件包

注意:平台消息是异步的,还有可能会出错

  1. 创建插件包
$ mkdir test_lib && cd test_lib
$ flutter create -t plugin --org com.ajanuw ./
$ code .
  1. 编写lib\test_lib.dart,也就是别人使用你的api
import 'dart:async';

import 'package:flutter/services.dart';

class TestLib {
static const MethodChannel _channel =
const MethodChannel('github.com/januwA/test_lib'); static Future<String> get platformVersion async {
final String version = await _channel.invokeMethod('getPlatformVersion');
return version;
} static Future<String> hello(String value) {
return _channel.invokeMethod('hello', {"message": value});
}
}
  1. 编写android\src\main\kotlin\com\example\test_lib\TestLibPlugin.kt,在这里处理flutter发来的消息
package com.example.test_lib

import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import io.flutter.plugin.common.PluginRegistry.Registrar // 这里需要和test_lib.dart里面注册的一样
const val CHANNEL: String = "github.com/januwA/test_lib" /** TestLibPlugin */
public class TestLibPlugin: FlutterPlugin, MethodCallHandler { override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), CHANNEL).setMethodCallHandler(TestLibPlugin());
} companion object {
@JvmStatic
fun registerWith(registrar: Registrar) {
MethodChannel(registrar.messenger(), CHANNEL).setMethodCallHandler(TestLibPlugin())
}
} override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
when(call.method) {
"getPlatformVersion" -> result.success("Android ${android.os.Build.VERSION.RELEASE}")
"hello" -> result.success("hello " + call.argument("message"))
else -> result.notImplemented()
}
} override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
}
}

example

import 'package:flutter/material.dart';
import 'package:test_lib/test_lib.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: FutureBuilder(
future: TestLib.platformVersion,
builder: (context, AsyncSnapshot<String> snap) {
if (snap.connectionState == ConnectionState.done) {
return Text(snap.data);
}
return SizedBox();
},
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.ac_unit),
onPressed: () {
TestLib.hello("Ajanuw").then(print); // hello Ajanuw
},
),
),
);
}
}

Flutter Android Toast Message(flutter访问Android Toast Message)的更多相关文章

  1. Android学习笔记_54_自定义 Widget (Toast)

    1.Toast控件: 通过查看源代码,发现Toast里面实现的原理是通过服务Context.LAYOUT_INFLATER_SERVICE获取一个LayoutInflater布局管理器,从而获取一个V ...

  2. <Android 基础(十六)> Toast

    介绍 A toast provides simple feedback about an operation in a small popup. It only fills the amount of ...

  3. Android中通过反射来设置Toast的显示时间

    这个Toast的显示在Android中的用途还是非常大的,同一时候我们也知道toast显示的时间是不可控的.我们仅仅能改动他的显示样式和显示的位置,尽管他提供了一个显示时间的设置方法.可是那是没有效果 ...

  4. Toast显示图文界面——Android开发之路1

    Toast的多种使用方法 Toast其实是一个功能特别强大的组件,不仅仅可以吐司一个文本内容,还可以吐司图片以及图文混排的界面.具体用法如下: 第一种:简单的纯文本内容的吐司: Toast.makeT ...

  5. android学习笔记21——消息提示Toast

    消息提示可细分为两种:大量消息提示——当程序有大量图片.信息需要展示时,采用对话框消息提示: 小量消息提示——当程序只有少量信息需要呈现给用户时,采用轻量级的对话框——Toast; Toast ==& ...

  6. Android Studio集成Flutter

    首先Flutter中文网教程地址:https://flutterchina.club/get-started/install/ 1.新建环境变量 变量名:PUB_HOSTED_URL 变量值:http ...

  7. Android界面设计之对话框——定制Toast、AlertDialog

    一.概述 在界面设计中需要根据用户操作显示提示信息.出错信息等,就要用到对话框.Android实现提示信息显示常用有两种方式 1.Toast 2.AlertDialog 二.Toast Android ...

  8. Android学习(十八)Toast的使用

    一.什么是Toast 1.Toast是一种提供给用户简洁提示信息的视图. 2.该视图以浮于应用程序之上的形式呈现给用户, Toast提示界面不获取焦点,在不影响用户使用的情况下,给用户某些提示. 3. ...

  9. Flutter学习笔记(30)--Android原生与Flutter混编

    如需转载,请注明出处:Flutter学习笔记(30)--Android原生与Flutter混编 这篇文章旨在学习如何在现有的Android原生项目上集成Flutter,实现Android与Flutte ...

随机推荐

  1. 「THP3考前信心赛」题解

    目录 写在前面 A 未来宇宙 B 空海澄澈 C 旧约酒馆 算法一 算法二 D 博物之志 算法一 算法二 算法三 写在前面 比赛地址:THP3 考前信心赛. 感谢原出题人的贡献:第一题 CF1422C, ...

  2. poj2631

    求一棵树的直径,所谓直径就是树上距离最远的两个点! 树形动归,每个点的为根的子树的最长向下链和次长链的和! 当然也可以二次深搜! ----------------------------------- ...

  3. Spring Cloud系列之Commons - 1. 背景与基础知识准备

    本文基于 Spring Cloud 2020.0 发布版的依赖 本系列会深入分析 Spring Cloud 的每一个组件,从Spring Cloud Commons这个 Spring Cloud 所有 ...

  4. Codeforces 1220D 思维 数学 二分图基础

    原题链接 题意 我们有一个含多个正整数的集合B,然后我们将所有的整数,也就是Z集合内所有元素,都当做顶点 两个整数 \(i , j\) 能建立无向边,当且仅当 \(|i - j|\) 这个数属于B集合 ...

  5. 转载,Pandas 数据统计用法

    pandas模块为我们提供了非常多的描述性统计分析的指标函数,如总和.均值.最小值.最大值等,我们来具体看看这些函数: 1.随机生成三组数据import numpy as npimport panda ...

  6. form(form基础、标签渲染、错误显示 重置信息、form属性、局部钩子、全局钩子)

    form基础 Django中的Form使用时一般有两种功能: 1.生成html标签 2.验证输入内容 要想使用django提供的form,要在views里导入form模块 from django im ...

  7. centos安装、升级新火狐最新版 31

    1.登录火狐主页 下载最新版本firefox-31.0.tar.bz2 解压: tar -jxvf firefox-31.0.tar.bz2 2.然后把旧版本的firefox卸掉 # yum eras ...

  8. OpenStack (nova 计算服务)

    nova介绍 Nova 负责维护和管理云环境的计算资源,Nova这个模块很重要,可以说是 OpenStack 的最核心的服务模块之一,以至于在 OpenStack 的初期版本里大部分的云系统管理功能都 ...

  9. HashMap源码(JDK1.8)-手动注释

    HashMap简介 HashMap是一种K-V映射的一种数据结构,通过K(key)值能实现在O(1)的时间复杂度下找到对应的V(value).JDK1.8之前,HashMap的底层数据结构是数组+链表 ...

  10. PAT(乙级)2020年秋季考试

    比赛链接:https://pintia.cn/market/item/1302816969611366400 7-1 多二了一点 (15分) 题解 模拟. 代码 #include <bits/s ...