程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在 Flutter 中导航时保存变量的值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在 Flutter 中导航时保存变量的值?

开发过程中遇到在 Flutter 中导航时保存变量的值的问题如何解决?下面主要结合日常开发的经验,给出你关于在 Flutter 中导航时保存变量的值的解决方法建议,希望对你解决在 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:

  1. https://youtu.be/O71rYKcxUgA
  2. https://youtu.be/MkFjtCov62g

我建议您观看它们,因为它们是同一个人创作的,其中一个介绍了 Provider 是什么,另一个向您展示了如何使用它。第二个视频有一个与您的用例类似的示例,但我建议您仍然观看这两个视频。

希望这会有所帮助。如果这回答了您的问题,或者您需要更多帮助或说明,请告诉我。

大佬总结

以上是大佬教程为你收集整理的在 Flutter 中导航时保存变量的值全部内容,希望文章能够帮你解决在 Flutter 中导航时保存变量的值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。