我正在开发我的第一个 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 。
最佳答案
您可以使用 GlobalKey
使其按您想要的方式工作。
由于我无权访问您的数据库内容,这就是我给您的想法的方式。将此代码复制并粘贴到您的类(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/