Flutter snackbar 替代方案还是比将所有内容包装在 Scaffold 中更简单的方法?

标签 flutter notifications snackbar

我正在开发我的第一个 Flutter 应用(在我的 Android 手机上进行调试)。我有一个包含行项目的列表。当您长按该行时,它会将内容复制到用户的剪贴板中。这很好用!

但我需要让用户知道内容已被复制。

我尝试按照许多教程来尝试将行包围在构建方法中或在脚手架内,但我无法工作。是否有另一种方法来通知用户(简单地)诸如“已复制!”之类的内容?发生了吗?

请注意下面注释掉的 Scaffold.of(... 。似乎除了将所有内容包装在 Scaffold 中之外,还必须有一种更简单的方法来通知用户。(当我尝试,它破坏了我的布局)。

import 'package:flutter/material.dart';
import 'package:my_app/Theme.dart' as MyTheme;
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/services.dart';

class RowRule extends StatelessWidget {
  final DocumentSnapshot ruleGroup;

  RowRule(this.ruleGroup);

  _buildChildren() {
    var builder = <Widget>[];
    if (!ruleGroup['label'].isEmpty) {
      builder.add(new Text(ruleGroup['label'],
          style: MyTheme.TextStyles.articleContentLabelTextStyle));
    }
    if (!ruleGroup['details'].isEmpty) {
      builder.add(new Text(ruleGroup['details'],
          style: MyTheme.TextStyles.articleContentTextStyle));
    }
    return builder;
  }


  @override
  Widget build(BuildContext context) {
    return new GestureDetector(
        onLongPress: () {
          Clipboard.setData(new ClipboardData(text: ruleGroup['label'] + " "  + ruleGroup['details']));
//          Scaffold.of(context).showSnackBar(SnackBar
//            (content: Text('text copied')));
        },
        child: Container(
          margin: const EdgeInsets.symmetric(vertical: 3.0),
          child: new FlatButton(
            color: Colors.white,
            padding: EdgeInsets.symmetric(horizontal: 0.0),
            child: new Stack(
              children: <Widget>[
                new Container(
                  margin: const EdgeInsets.symmetric(
                    vertical: MyTheme.Dimens.ruleGroupListRowMarginVertical),
                  child: new Container(
                      child: Padding(
                        padding: EdgeInsets.symmetric(horizontal: 32.0, vertical: 8.0),
                        child: new Column(
                          crossAxisAlignment: CrossAxisAlignment.stretch,
                          children: _buildChildren(),
                        ),
                    )),
              )
            ],
          ),
        ),
      ));
    }
  }

目标是有一个像这样的页面(见图),我有它,它可以工作和滚动......等等,但我不能让它与脚手架一起工作,因此,一直没能使用 snackbar 。每个“行”(此文件用于)都应在 longPress 上显示一个 snackbar 。

enter image description here

最佳答案

您可以使用 GlobalKey 使其按您想要的方式工作。

enter image description here

由于我无权访问您的数据库内容,这就是我给您的想法的方式。将此代码复制并粘贴到您的类(class)中,并进行相应的更改。我也认为你的 RowRule 类有问题,你能复制我给你的完整代码并运行吗?

void main() => runApp(MaterialApp(home: HomePage()));

class HomePage extends StatelessWidget {
  final GlobalKey<ScaffoldState> _key = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color(0xFFFFFFFF).withOpacity(0.9),
      key: _key,
      body: Column(
        children: <Widget>[
          Container(
            color: Color.fromRGBO(52, 56, 245, 1),
            height: 150,
            alignment: Alignment.center,
            child: Container(width: 56, padding: EdgeInsets.only(top: 12), decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.yellow)),
          ),
          Expanded(
            child: ListView.builder(
              padding: EdgeInsets.zero,
              itemCount: 120,
              itemBuilder: (context, index) {
                return Container(
                  color: Colors.white,
                  margin: const EdgeInsets.all(4),
                  child: ListTile(
                    title: Text("Row #$index"),
                    onLongPress: () => _key.currentState
                      ..removeCurrentSnackBar()
                      ..showSnackBar(SnackBar(content: Text("Copied \"Row #$index\""))),
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

关于Flutter snackbar 替代方案还是比将所有内容包装在 Scaffold 中更简单的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55554827/

相关文章:

安卓通知 : make ticker text stay longer

android - 导航栏后面的 Snackbar

flutter - Flutter:针对整个应用程序的SnackBar方法,修改Scaffold以跟踪当前显示的Scaffolds的BuildContext

dart - Column 中的 Flutter 定位小部件

drop-down-menu - Flutter中如何自定义DropdownButtons和DropdownMenuItems?

android - android studio 上的 flutter 安装。没有 main.dart 或任何文件出现

performance - 简单的 Flutter ListView 不连贯的滚动

ios - 我们可以通过检查 isRegisteredForLocalNotifications 从 didRegisterForRemoteNotificationsWithDeviceToken 更新 ViewController

java - 单击通知后更改类 Android

长度不定的 Android 支持库 Snackbar