大佬教程收集整理的这篇文章主要介绍了在 Flutter 中导航时保存变量的值,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我是 Flutter 的新手,当我导航到 second_screen 时,我试图在 first_screen 上保存“counter”的值,然后当我导航到 first_screen 时,我想在 second_screen 上保存“secondCounter”的值。当我在两个屏幕之间导航时,“counter”和“secondCounter”值重置为 0,但我想保存它们的值。我的代码如下:
@H_52_2@main.dart :-import 'package:Flutter/material.dart';
import 'package:provIDer_practice/screens/first_screen.dart';
import 'package:provIDer_practice/screens/second_screen.dart';
voID main() {
runApp(MaterialApp(
home: FirstScreen(),routes: {
"/first" : (context) => FirstScreen(),"/second" : (context) => SecondScreen(),},));
}
first_screen :-
import 'package:Flutter/material.dart';
class FirstScreen extends StatefulWidget {
@overrIDe
_FirstScreenState createState() => _FirstScreenState();
}
class _FirstScreenState extends State<FirstScreen> {
int counter = 0;
@overrIDe
Widget build(BuildContext context) {
return Scaffold(
appbar: Appbar(
title: Text("First Screen"),),body: padding(
padding: const EdgeInsets.all(16.0),child: Center(
child: column(
mainAxisAlignment: MainAxisAlignment.center,children: [
Text("You pressed the button $counter times."),SizedBox(height: 20),Raisedbutton(
onpressed: () {
setState(() {
counter++;
});
},child: Text("Click Me"),Raisedbutton(
onpressed: () {
Navigator.pushnamed(context,"/second");
},child: Text("Go to Second"),],);
}
}
second_screen.dart :-
import 'package:Flutter/material.dart';
class SecondScreen extends StatefulWidget {
@overrIDe
_SecondScreenState createState() => _SecondScreenState();
}
class _SecondScreenState extends State<SecondScreen> {
int secondCounter = 0;
@overrIDe
Widget build(BuildContext context) {
return Scaffold(
appbar: Appbar(
title: Text("Second Screen"),children: [
Text("You pressed the button $secondCounter times."),Raisedbutton(
onpressed: () {
setState(() {
secondCounter++;
});
},"/first");
//Navigator.pop(context);
},child: Text("Go to First"),);
}
}
这很容易实现,有几种方法可以做到。
一种方法是将其作为参数传入。
如果您将计数器变量添加到 FirstScreen
/SecondScreen
小部件内部,则可以将它们添加到构造函数中。
示例:
class FirstScreen extends StatefulWidget {
int counter;
FirstScreen(counter);
@override
_FirstScreenState createState() => _FirstScreenState();
}
然后在您的状态正文中将文本更改为 Text("You pressed the button ${widget.counter} times.")
,将 setState 函数更改为 setState(() {widget.counter++;});
您可以在第二个小部件中执行相同的操作,创建一个名为 counter 的参数或任何您想要的参数,然后创建一个构造函数。如果不通过,您也可以将其设为必需或将其设置为默认值为 0。
最后,要将其传递给第二个小部件,您只需使用 Navigator.push(context,SecondScreen(widget.counter)
,反之亦然。但是,这不会让您使用命名路由。
另一种方法是使用参数和命名路由。我认为这更适合您的用例。
在您导航的两个屏幕中,只需添加一个 arguments 参数并传入计数器 Navigator.pushNamed(context,'routePath',arguments: counter);
。 (P.s. 您不必将计数器命名为 firstCounter 和 secondCounter,它们都可以称为 counter,因为它们位于不同的小部件中)。然后只需添加到两个小部件 counter = ModalRoute.of(context).arguments
。您也不需要将计数器值括在花括号 ({}
) 中。在视频中,他需要数据作为地图,所以他这样做了,但你只需要一个数字。希望这会有所帮助。
这是我找到的一个视频,它解释了如果您发现文本令人困惑,如何在命名路由中传递参数。就上下文而言,这是一个教授 Flutter 的视频系列,他目前正在构建的应用程序是一个世界时间应用程序。 Video Link。
如果您对整个课程感兴趣,这里是 Video Playlist
,我不确定您是否特别需要在应用程序重新启动时重置它,但如果在您重新启动应用程序时保留该值没有问题,那么这里有几个选项。无论哪种方式,您都可以在应用启动时通过将其重新设置为 0 来重置该值。
第一个也是最简单的方法是使用 this comment 中的答案。如果您在 IndexedStack
中有两个小部件(阅读更多信息 here),然后让按钮更改可以工作的堆栈索引,但您将失去页面过渡动画的好处,这是一个性能较低的选项随着您的应用程序的增长,即使没有使用 Flutter 也必须同时运行这两个小部件。
执行此操作的第二种更高效的方法是通过 Shared Preferences 包。这会将它保存到磁盘,因此如果您希望每次打开应用程序时它都为 0,则每次启动应用程序时都需要重置它。
第三种方法是使用外部数据库,例如 Firebase。 Firebase 提供他们的“Realtime Database”和更新的“Cloud Firestore”以及他们的身份验证服务都是免费的,因此它可能是您将来构建应用程序时考虑的一个选项。我会推荐 Firestore 而不是实时数据库,因为它更新并且我个人更喜欢它。此选项还需要您在启动应用程序时重置计数器,但这应该不是什么大问题。
您可以执行此操作的另一种方法(重新启动应用程序时不会保留状态)是使用 Provider Package。这个包得到了 Flutter 的认可,是管理状态的推荐方式。如果您在应用程序的根目录添加一个提供程序,那么它将被保留并且它可以为您存储第一个和第二个计数器。提供者有一点学习曲线,所以我建议你研究一下。
这里有两个视频帮助我开始使用 Provider:
我建议您观看它们,因为它们是同一个人创作的,其中一个介绍了 Provider 是什么,另一个向您展示了如何使用它。第二个视频有一个与您的用例类似的示例,但我建议您仍然观看这两个视频。
希望这会有所帮助。如果这回答了您的问题,或者您需要更多帮助或说明,请告诉我。
以上是大佬教程为你收集整理的在 Flutter 中导航时保存变量的值全部内容,希望文章能够帮你解决在 Flutter 中导航时保存变量的值所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。