gpt4 book ai didi

Flutter 通过支持返回上一个片段在片段之间切换

转载 作者:IT老高 更新时间:2023-10-28 12:37:46 26 4
gpt4 key购买 nike

this link在顺丰,@martinseal1987向我们展示如何使用分离的小部件链接与 android 片段。

我在我的项目中实现了这个解决方案,在运行项目之后,我没有任何问题将第一个小部件显示为 Fragment,但是当我按下返回按钮时,我的屏幕变黑并且无法作为片段返回之前的小部件

我认为应该是这样的:

enter image description here

问题navigateBackcustomPop 方法上,我可以通过按按钮附加片段

import 'package:flutter/material.dart';

void main()
{
runApp(MaterialApp(
title: 'AndroidMonks',
home: Scaffold(
appBar: AppBar(
title: Text('Androidmonks'),
backgroundColor: Colors.orangeAccent,
),
body: Home(),
),
));
}

class Home extends StatefulWidget {
Home({
Key key,
}) : super(key: key);

@override
State<Home> createState()=>_Home();
}

class _Home extends State<Home> {
String title = "Title";
int _currentIndex = 0;
final List<int> _backstack = [0];

@override
Widget build(BuildContext context) {
navigateTo(_currentIndex);
//each fragment is just a widget which we pass the navigate function
List<Widget> _fragments =[Fragment1(),Fragment2(),Fragment3()];
//will pop scope catches the back button presses
return WillPopScope(
onWillPop: () {
customPop(context);
},
child: Scaffold(
body: Column(
children: <Widget>[
RaisedButton(
child:Text('PRESS'),
onPressed: (){
_currentIndex++;
navigateTo(_currentIndex);
},
),
Expanded(
child: _fragments[_currentIndex],
),
],
),
),
);
}


void navigateTo(int index) {
_backstack.add(index);
setState(() {
_currentIndex = index;
});

_setTitle('$index');
}

void navigateBack(int index) {
setState(() {
_currentIndex = index;
});

_setTitle('$index');
}

customPop(BuildContext context) {
if (_backstack.length - 1 > 0) {
navigateBack(_backstack[_backstack.length - 1]);
} else {
_backstack.removeAt(_backstack.length - 1);
Navigator.pop(context);
}
}
//this method could be called by the navigate and navigate back methods
_setTitle(String appBarTitle) {
setState(() {
title = appBarTitle;
});
}
}

class Fragment2 extends StatefulWidget {
@override
State<Fragment2> createState() => _Fragment2();
}

class _Fragment2 extends State<Fragment2> {
@override
Widget build(BuildContext context) {
return Center(
child: RaisedButton(
child: Text("_Fragment2"),
onPressed: (){
}),
);
}
}


class Fragment1 extends StatefulWidget {
@override
State<Fragment1> createState() => _Fragment1();
}

class _Fragment1 extends State<Fragment1> {
@override
Widget build(BuildContext context) {
return Center(
child: Text("_Fragment1"),
);
}
}


class Fragment3 extends StatefulWidget {
@override
State<Fragment3> createState() => _Fragment3();
}

class _Fragment3 extends State<Fragment3> {
@override
Widget build(BuildContext context) {
return Center(
child: Text("_Fragment3"),
);
}
}

最佳答案

我在您的代码中修复了一些逻辑,请仔细检查更改,如果您有任何问题,请不要犹豫,这是工作代码

import 'package:flutter/material.dart';

void main()
{
runApp(MaterialApp(
title: 'AndroidMonks',
home: Scaffold(
appBar: AppBar(
title: Text('Androidmonks'),
backgroundColor: Colors.orangeAccent,
),
body: Home(),
),
));
}

class Home extends StatefulWidget {
Home({
Key key,
}) : super(key: key);

@override
State<Home> createState()=>_Home();
}

class _Home extends State<Home> {
String title = "Title";
List<Widget> _fragments =[Fragment1(),Fragment2(),Fragment3()];
int _currentIndex = 0;
final List<int> _backstack = [0];

@override
Widget build(BuildContext context) {
//navigateTo(_currentIndex);
//each fragment is just a widget which we pass the navigate function

//will pop scope catches the back button presses
return WillPopScope(
onWillPop: () {
return customPop(context);
},
child: Scaffold(
body: Column(
children: <Widget>[
RaisedButton(
child:Text('PRESS'),
onPressed: (){
_currentIndex++;
navigateTo(_currentIndex);
},
),
Expanded(
child: _fragments[_currentIndex],
),
],
),
),
);
}


void navigateTo(int index) {
_backstack.add(index);
setState(() {
_currentIndex = index;
});

_setTitle('$index');
}

void navigateBack(int index) {
setState(() {
_currentIndex = index;
});

_setTitle('$index');
}

Future<bool> customPop(BuildContext context) {
print("CustomPop is called");
print("_backstack = $_backstack");
if (_backstack.length > 1) {
_backstack.removeAt(_backstack.length - 1);
navigateBack(_backstack[_backstack.length - 1]);

return Future.value(false);
} else {

return Future.value(true);
}
}
//this method could be called by the navigate and navigate back methods
_setTitle(String appBarTitle) {
setState(() {
title = appBarTitle;
});
}
}

class Fragment2 extends StatefulWidget {
@override
State<Fragment2> createState() => _Fragment2();
}

class _Fragment2 extends State<Fragment2> {
@override
Widget build(BuildContext context) {
return Center(
child: RaisedButton(
child: Text("_Fragment2"),
onPressed: (){
}),
);
}
}


class Fragment1 extends StatefulWidget {
@override
State<Fragment1> createState() => _Fragment1();
}

class _Fragment1 extends State<Fragment1> {
@override
Widget build(BuildContext context) {
return Center(
child: Text("_Fragment1"),
);
}
}


class Fragment3 extends StatefulWidget {
@override
State<Fragment3> createState() => _Fragment3();
}

class _Fragment3 extends State<Fragment3> {
@override
Widget build(BuildContext context) {
return Center(
child: Text("_Fragment3"),
);
}
}

a

关于Flutter 通过支持返回上一个片段在片段之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56223550/

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