現(xiàn)有的Toast庫都太重了。寫了一堆的代碼,這個(gè)才是最正確晴音,最簡單的。
看一下Overlay的注釋:
/// A [Stack] of entries that can be managed independently.
一個(gè)stack控件缔杉,可以管理依賴它的entries
///
/// Overlays let independent child widgets "float" visual elements on top of
/// other widgets by inserting them into the overlay's [Stack]. The overlay lets
/// each of these widgets manage their participation in the overlay using
/// [OverlayEntry] objects.
Overlays通過把子widget插入到overlay的stack里面锤躁, 讓依賴它的子widget可以浮在其它的可見元素上面。OverlayEntry可以管理漂浮的widgets或详。(一個(gè)OverlayEntry就是一個(gè)層)
///
/// Although you can create an [Overlay] directly, it's most common to use the
/// overlay created by the [Navigator] in a [WidgetsApp] or a [MaterialApp]. The
/// navigator uses its overlay to manage the visual appearance of its routes.
///
雖然我們可以自己創(chuàng)建一個(gè)Overlay,但是更通常的做法是系羞,使用MaterialApp或者WidgetsApp中Navigator對(duì)象創(chuàng)建的Overlay. navigator使用overlay來管理可見的路由。(查看一下Navigator的源碼霸琴,里面是返回了一個(gè)Overlay的椒振,我們可以直接在這個(gè)Overlay中插入OverlayEntry來制作類似Toast,Loaing這樣的widgets)
/// See also:
///
/// * [OverlayEntry].
/// * [OverlayState].
/// * [WidgetsApp].
/// * [MaterialApp].
下面是一個(gè)簡單的Toast。Global.context是我自己定義的全局對(duì)象梧乘,在頁面創(chuàng)建的時(shí)候保存了BuildContext, 這樣在一些地方可以方便調(diào)用澎迎。也可以不保存庐杨,方法變成這樣:
static void show(BuildContext context, String message, {int duration})
class Toast {
static void show(String message, {int duration}) {
OverlayEntry entry = OverlayEntry(builder: (context) {
return Container(
color: Colors.transparent,
margin: EdgeInsets.only(
top: MediaQuery.of(context).size.height * 0.7,
),
alignment: Alignment.center,
child: Center(
child: Container(
color: Colors.grey,
child: Padding(
padding: const EdgeInsets.all(8),
child: Material(
child: Text(
message,
style: TextStyle(),
),
),
),
),
),
);
});
Overlay.of(Global.context).insert(entry);
Future.delayed(Duration(seconds: duration ?? 2)).then((value) {
// 移除層可以通過調(diào)用OverlayEntry的remove方法。
entry.remove();
});
}
}
Loading同上夹供,自己動(dòng)手試一下比什么都來得快灵份。