- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在按照 Flutter 文档中的教程进行操作,您在其中创建了一个启动命名应用程序。该应用程序由两个页面组成:一个是无限的随机生成的启动名称列表,您可以将其添加到您的收藏夹,另一个是收藏夹页面,您可以在其中查看您保存的名称。
完成本教程后,我尝试添加一些自己的功能,我希望能够通过在“收藏夹”页面上点击某个名称来取消收藏。下面是将收藏夹页面推送到导航器的代码:
Navigator.of(context).push(
MaterialPageRoute<void>(
builder: (BuildContext context) {
final Iterable<ListTile> tiles = _saved.map(
(WordPair pair) {
return ListTile(
title: Text(
pair.asPascalCase,
style: _biggerFont,
),
// Code I added //
trailing: Icon(Icons.delete),
onTap: () {
setState(() {
_saved.remove(pair);
});
},
// End //
);
},
);
final List<Widget> divided = ListTile
.divideTiles(
context: context,
tiles: tiles,
)
.toList();
return Scaffold(
appBar: AppBar(
title: Text('Saved suggestions'),
),
body: ListView(children: divided),
);
},
),
);
}
但它并没有像它应该的那样工作:你确实可以通过点击它们来取消保存名称,但是只有在你返回主页然后再次回到收藏夹页面(或在换句话说,什么时候调用 Builder?)。
那么我该如何解决这个问题呢?我是否需要为收藏夹页面创建一个有状态的小部件?如果是,我如何将 _saved 集传递给我的新小部件?
如果有人需要整个代码: https://pastebin.com/asLneaKe
最佳答案
使用 StatefulBuilder 包装效果很好。
你可以看到完整的代码和工作演示
代码片段
MaterialPageRoute<void>(
builder: (BuildContext context) {
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
final Iterable<ListTile> tiles = _saved.map(
工作演示
完整代码
import 'package:english_words/english_words.dart' as prefix0;
import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Startup Name Generator',
theme: ThemeData(
primaryColor: Colors.white,
),
home: RandomWords(),
);
}
}
class RandomWords extends StatefulWidget {
@override
RandomWordsState createState() => RandomWordsState();
}
class RandomWordsState extends State<RandomWords> {
final List<WordPair> _suggestions = <WordPair>[];
final Set<WordPair> _saved = Set<WordPair>();
final TextStyle _biggerFont = const TextStyle(fontSize: 18.0);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Startup Name Generator'), actions: <Widget>[
// Icone 3 linhas
IconButton(
icon: Icon(Icons.list),
onPressed: _pushSaved,
),
]),
body: _buildSuggestions(),
);
}
Widget _buildRow(WordPair pair) {
final bool alreadySaved = _saved.contains(pair);
return ListTile(
title: Text(
pair.asPascalCase,
style: _biggerFont,
),
trailing: Icon(
alreadySaved ? Icons.favorite : Icons.favorite_border,
color: alreadySaved ? Colors.red : null,
),
onTap: () {
setState(() {
if (alreadySaved) {
_saved.remove(pair);
} else {
_saved.add(pair);
}
});
});
}
Widget _buildSuggestions() {
return ListView.builder(
padding: const EdgeInsets.all(16.0),
itemBuilder: (context, i) {
if (i.isOdd) return Divider();
final index = i ~/ 2;
if (index >= _suggestions.length) {
_suggestions.addAll(generateWordPairs().take(10));
}
return _buildRow(_suggestions[index]);
},
);
}
void _pushSaved() {
Navigator.of(context).push(
MaterialPageRoute<void>(
builder: (BuildContext context) {
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
final Iterable<ListTile> tiles = _saved.map(
(WordPair pair) {
return ListTile(
title: Text(
pair.asPascalCase,
style: _biggerFont,
),
// Code I added //
trailing: Icon(Icons.delete),
onTap: () {
setState(() {
_saved.remove(pair);
});
},
// End //
);
},
);
final List<Widget> divided = ListTile.divideTiles(
context: context,
tiles: tiles,
).toList();
return Scaffold(
appBar: AppBar(
title: Text('Saved suggestions'),
),
body: ListView(children: divided),
);
});
},
),
);
}
}
关于flutter - 如何改变 MaterialPageRoute 的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58607663/
我有4个屏幕。 X,A,B,C。导航模式应如下所示 这是代码 X 屏幕 class X extends StatelessWidget { @override Widget build(Bui
我一直在学习使用Flutter文档编写应用程序达2周之久。今天,我遇到了有关Navigator.push()的问题。一切正常,但不是在重新启动笔记本电脑之后。我找不到解决方案,我尝试过 flutter
是否可以在 RaisedButton 中关闭 MaterialPageRoute?我想这样做,如果您在文本字段中输入 1 并转到第 2 页。这可能吗?如果可能的话如何? Padding(
我正在按照 Flutter 文档中的教程进行操作,您在其中创建了一个启动命名应用程序。该应用程序由两个页面组成:一个是无限的随机生成的启动名称列表,您可以将其添加到您的收藏夹,另一个是收藏夹页面,您可
设置 我必须使用简单的路线,FirstRoute 和 SecondRoute。每个都包含一个用于导航的按钮。按 FirstRoute 的按钮会转到第二个,反之亦然。 异常 当我尝试从 FirstRou
我正在构建一个使用 Flutter 播放音乐的应用程序。 我创建了一个名为 MusicService 的类,其中所有音乐功能都在 playMusic、seekMusic、onAudioComplete
我正在创建一个包含 TextField 的页面,当用户在其中输入 3 个以上的字符时,我会从数据库中获取包含插入文本的行。在我提供的示例中,我通过获取列表来模拟它。向用户显示此列表后,用户可以点击其中
是否可以通过通知点击导航到应用中的特定 MaterialPageRoute?我在主屏幕中配置了通知: void _configureNotifications() { final Firebase
在下面的示例中,当我推送新的 MaterialPageRoute 时,它与 Flutter 小部件树中的 Home 小部件在同一级别上创建。我想把它作为小部件 Home 的 child ,所以 H
我有一个显示用户列表的小部件。单击列表元素时,将创建一个新的 MaterialPageRoute 并将其推送到导航器以打开显示消息历史记录的该用户的聊天屏幕。 class Users extends
我正在构建一个 flutter 应用程序,我正在尝试使用 MaterialPageRouter 将数据传递到页面,但我收到一条错误消息,提示 “参数类型 'MaterialPageRoute dyna
我想使用 Navigator.push (MaterialPageRoute) 而不是 AlertDialog,因为现在我认为让我的用户拥有一个完整的页面来发布内容而不是一个对话框更好,我将如何编辑我
我收到此错误 flutter_windows_v1.9.0-dev 但我不知道如何解决它。 Missing type arguments for generic type "MaterialPageR
我目前可以将 MaterialRoute 从 Flutter 中的 Home App 路由到页面,并显示一个弹出对话框。但是,从第二页路由到第三页(其中包含一个应该显示对话的按钮)时,我收到此错误:[
我正在学习 flutter,这段代码直接来自老师。我知道 flutter 一直在变化,这可能就是它没有运行的原因。不管怎样,它是: class Klimatic extends StatefulWid
我正在尝试使用命名路由导航到另一个页面: ... RaisedButton( child: Text('Get image'), onPressed:
我是一名优秀的程序员,十分优秀!