我有问题。我不知道每次按下某个按钮时如何添加页面。
现在,我的意思是,当您按添加按钮时,下面的代码(在阅读问题之前请检查代码)将打开特定页面并添加新按钮。但是所有这些按钮将打开同一页面。如何使每个按钮打开不同的页面?
import 'package:flutter/material.dart';
void main() => runApp(MainPage());
class MainPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp (
debugShowCheckedModeBanner: false,
home:Scaffold (
backgroundColor: Colors.white,
body: Column (
children: <Widget> [
Container (
height: 100.0
),
Body(),
]
)
)
);
}
}
class Body extends StatefulWidget {
@override
_BodyState createState() => _BodyState();
}
class _BodyState extends State<Body> {
final String open1 = 'open';
int count = 1;
@override
Widget build(BuildContext context) {
return Expanded (
child: Container (
child: NotificationListener<OverscrollIndicatorNotification> (
onNotification: (OverscrollIndicatorNotification overscroll) {
overscroll.disallowGlow();
},
child: PageView.builder(
reverse: true,
pageSnapping: false,
controller: PageController(viewportFraction: 0.85),
itemCount: count,
itemBuilder: (context, i) {
if (i == 0) {
return GestureDetector (
onTap: () {
Navigator.push(
context,
MaterialPageRoute (
builder: (context) => Page (
open: open1,
)
),
);
count++;
},
child: Hero (
tag: open1,
child: Padding (
padding: EdgeInsets.only(
left: MediaQuery.of(context).size.height * 0.015,
right: MediaQuery.of(context).size.height * 0.015,
top: MediaQuery.of(context).size.width * 0.08,
bottom: MediaQuery.of(context).size.width * 0.15
),
child: Material (
borderRadius: BorderRadius.circular(40.0),
color: Colors.white,
elevation: 8.0,
child: InkWell (
child: Column (
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget> [
Icon (
Icons.add,
size: 30.0,
color: Colors.black,
)
]
),
)
)
)
)
);
}
else {
return RCard(i);
}
}
)
)
)
);
}
}
class RCard extends StatefulWidget {
final int count;
RCard(this.count);
@override
RCardState createState() => RCardState();
}
class RCardState extends State<RCard> {
int count;
String open2;
@override
void initState() {
super.initState();
count = widget.count;
open2 = 'open$count';
}
@override
Widget build(BuildContext context) {
return Hero (
tag: open2,
child: GestureDetector (
onTap: () {
Navigator.push(
context,
MaterialPageRoute (
builder: (context) => Page (
open: open2,
)
),
);
},
child: Padding (
padding: EdgeInsets.only(
left: MediaQuery.of(context).size.height * 0.015,
right: MediaQuery.of(context).size.height * 0.015,
top: MediaQuery.of(context).size.width * 0.08,
bottom: MediaQuery.of(context).size.width * 0.15
),
child: Material (
borderRadius: BorderRadius.circular(40.0),
color: Colors.white,
elevation: 8.0,
)
)
),
);
}
}
class Page extends StatelessWidget {
final String open;
Page({this.open});
@override
Widget build(BuildContext context) {
return GestureDetector (
child: Hero (
tag: open,
child: Material (
child: Center(child: Text('New page')),
)
),
onTap: () {
Navigator.pop(context);
},
);
}
}
答案 0 :(得分:1)
下面将创建RCard
和Page
实例,并将它们存储在List
中,以备将来检索。
import 'package:flutter/material.dart';
void main() => runApp(MainPage());
class MainPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
backgroundColor: Colors.white,
body: Column(
children: <Widget>[
Container(height: 100.0),
Body(),
],
),
),
);
}
}
class Body extends StatefulWidget {
@override
_BodyState createState() => _BodyState();
}
class _BodyState extends State<Body> {
final List<RCard> _cards = [];
PageController _controller;
@override
void initState() {
super.initState();
_controller = PageController(viewportFraction: 0.85);
}
@override
void dispose() {
_controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Expanded(
child: Container(
child: NotificationListener<OverscrollIndicatorNotification>(
onNotification: (OverscrollIndicatorNotification overScroll) {
overScroll.disallowGlow();
},
child: PageView.builder(
pageSnapping: false,
controller: _controller,
itemCount: _cards.length + 1,
itemBuilder: (context, index) {
RCard card;
final newIndex = index + 1;
if (index < _cards.length) {
card = _cards[index];
} else {
final tag = '$newIndex';
final newPage = Page(
tag,
);
final newCard = RCard(
tag,
newPage,
);
card = RCard(
tag,
Page(
tag,
onTap: () {
_controller.jumpToPage(newIndex);
},
),
onTap: () {
_cards.add(newCard);
},
);
}
return card;
},
),
),
),
);
}
}
class RCard extends StatelessWidget {
final String tag;
final Page page;
final VoidCallback onTap;
RCard(this.tag, this.page, {this.onTap});
@override
Widget build(BuildContext context) {
return Hero(
tag: tag,
child: GestureDetector(
onTap: () {
if (onTap != null) onTap();
Navigator.push(
context,
MaterialPageRoute(builder: (context) => page),
);
},
child: Padding(
padding: EdgeInsets.only(
left: MediaQuery.of(context).size.height * 0.015,
right: MediaQuery.of(context).size.height * 0.015,
top: MediaQuery.of(context).size.width * 0.08,
bottom: MediaQuery.of(context).size.width * 0.15),
child: Material(
borderRadius: BorderRadius.circular(40.0),
color: Colors.white,
elevation: 8.0,
child: onTap == null
? Container()
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(
Icons.add,
size: 30.0,
color: Colors.black,
)
],
),
),
),
),
);
}
}
class Page extends StatelessWidget {
final String tag;
final VoidCallback onTap;
Page(this.tag, {this.onTap});
@override
Widget build(BuildContext context) {
return GestureDetector(
child: Hero(
tag: tag,
child: Material(
child: Center(child: Text('New Page $tag')),
),
),
onTap: () {
if (onTap != null) onTap();
Navigator.pop(context);
},
);
}
}
答案 1 :(得分:0)
您可以将要打开的所有页面存储在数组中,然后在itembuilder中使用索引打开页面。
答案 2 :(得分:0)
您已经拥有了想要的东西。每次创建页面时,您都将打开一个不同的实例。您可以通过修改代码来进行检查,如下所示:
layers = ['conv1/7x7_s2','pool1/3x3_s2']
for idx, layer in enumerate(layers):
print(layer.replace('/', '_'))
# or maybe this might work?
# print(layer.replace('/', u"\u2215"))
答案 3 :(得分:0)
您已经做得不错,只需稍作修改即可尝试。
import 'package:flutter/material.dart';
void main() => runApp(MainPage());
class MainPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Column(
children: <Widget>[
SizedBox(height: 70.0),
Body(),
],
),
),
);
}
}
class Body extends StatefulWidget {
@override
_BodyState createState() => _BodyState();
}
class _BodyState extends State<Body> {
final String _open1 = 'open';
int _count = 1;
@override
Widget build(BuildContext context) {
return Expanded(
child: NotificationListener<OverscrollIndicatorNotification>(
onNotification: (OverscrollIndicatorNotification overscroll) {
print("CoolTag: onNotification");
overscroll.disallowGlow();
},
child: PageView.builder(
reverse: true,
pageSnapping: false,
controller: PageController(viewportFraction: 0.85),
itemCount: _count,
itemBuilder: (context, i) {
if (i == 0) {
return GestureDetector(
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => Page(open: _open1, count: i,)));
_count++;
},
child: Hero(
tag: _open1,
child: Padding(
padding: EdgeInsets.only(
left: MediaQuery.of(context).size.height * 0.015,
right: MediaQuery.of(context).size.height * 0.015,
top: MediaQuery.of(context).size.width * 0.08,
bottom: MediaQuery.of(context).size.width * 0.15),
child: Material(
borderRadius: BorderRadius.circular(40.0),
color: Colors.white,
elevation: 8.0,
child: Icon(Icons.add, size: 30.0, color: Colors.black),
),
),
),
);
} else {
return RCard(i);
}
},
),
),
);
}
}
class RCard extends StatefulWidget {
final int count;
RCard(this.count);
@override
RCardState createState() => RCardState();
}
class RCardState extends State<RCard> {
int _count;
String _open2;
@override
void initState() {
super.initState();
_count = widget.count;
_open2 = 'open$_count';
}
@override
Widget build(BuildContext context) {
return Hero(
tag: _open2,
child: GestureDetector(
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => Page(open: _open2, count: _count,)));
},
child: Padding(
padding: EdgeInsets.only(
left: MediaQuery.of(context).size.height * 0.015,
right: MediaQuery.of(context).size.height * 0.015,
top: MediaQuery.of(context).size.width * 0.08,
bottom: MediaQuery.of(context).size.width * 0.15),
child: Material(
borderRadius: BorderRadius.circular(40.0),
color: Colors.white,
elevation: 8.0,
child: Center(child: Text("Page ${_count}")),
),
),
),
);
}
}
class Page extends StatelessWidget {
final String open;
final int count;
Page({this.open, this.count});
@override
Widget build(BuildContext context) {
return GestureDetector(
child: Hero(
tag: open,
child: Material(child: Center(child: Text('New page ${count}'))),
),
onTap: () => Navigator.pop(context),
);
}
}