gpt4 book ai didi

dart - 按下时如何创建页面

转载 作者:IT老高 更新时间:2023-10-28 12:41:50 25 4
gpt4 key购买 nike

我有问题。每次按下某个按钮时,我都不知道如何添加页面。

现在,我的意思是来自下面的代码(在阅读问题之前检查代码)当您按下添加按钮时,它将打开某个页面并添加一个新按钮。但是所有这些按钮都会打开同一个页面。如何让每个按钮打开不同的页面?

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);
},
);
}
}

最佳答案

下面将创建 RCardPage 实例并将它们存储在 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);
},
);
}
}

关于dart - 按下时如何创建页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55260138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com