【问题标题】:During restart app comes to initial state在重新启动应用程序进入初始状态
【发布时间】:2021-08-17 21:09:39
【问题描述】:

我正在学习颤振,我是新手! 我用颤振制作了一个应用程序,并在那个体内放置了一个容器。 应用程序也有动态页面,可以动态添加到容器中,所以我使用 list.view Builder, 并通过滚动查看此页面。 但是当应用程序关闭并重新启动时,这些页面消失了!! 即使在应用程序重新启动后,我也想将这些页面保留在 Container 中!!!! 这是我的代码

import 'package:dynamic_widget/Contact.dart';
import 'package:dynamic_widget/DataBase%20Helper/DataBaseHelper.dart';
import 'package:dynamic_widget/DataBase.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

final DataBaseUnit dataBase = new DataBaseUnit();

void main() {
  runApp( MaterialApp(home: HomeScreen()));
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key key}) : super(key: key);

  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen>  {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('HOME'),
        actions: [
          IconButton(
              icon: Icon(Icons.add),
              onPressed: () {
                setState(() {
                  addWidget();
                });
              }),
        ],
      ),
      body: Container(
        // height: 200,
        padding: EdgeInsets.all(20),
        color: Colors.deepOrange,
        child: Column(
          children: <Widget>[
            Flexible(
              child: ListView.builder(
                scrollDirection: Axis.horizontal,
                itemCount: listWidget.length,
                itemBuilder: (_, index) => listWidget[index],
                padding: EdgeInsets.symmetric(),
              ),
            ),
            FloatingActionButton(
                child: Icon(Icons.add),
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => ContentScreen()),
                  );
                })
          ],
        ),
      ),
    );
  }

/////////////////////////////////////////////////////////////////////




/////////////////////////////////////////////////////////////
List<Widget> listWidget = [];

// List<DynamicWidget2> listWidget2 = [];

addWidget() async {
  listWidget.add(new DynamicWidget());
}

addWidget2() {
  listWidget.add(new DynamicWidget2());
}

////////////////////////////////////////////////////////
class DynamicWidget extends StatefulWidget {
  @override
  _DynamicWidgetState createState() => _DynamicWidgetState();
}

class _DynamicWidgetState extends State<DynamicWidget> {
  bool showDialog = false;
  TextEditingController RoomName = new TextEditingController();
  TextEditingController Code = new TextEditingController();
  TextEditingController B1 = new TextEditingController();
  TextEditingController B2 = new TextEditingController();
  TextEditingController B3 = new TextEditingController();
  TextEditingController B4 = new TextEditingController();
  String name = "";
  String code = "";
  String b1 = "";
  String b2 = "";
  String b3 = "";
  String b4 = "";
  @override
  Widget build(BuildContext context) {
    return Container(
        alignment: Alignment.center,
        width: 400,
        padding: EdgeInsets.all(10),
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(20),
        ),
        child: Container(
          width: 300,
          height: 600,
          padding: EdgeInsets.all(10),
          decoration: BoxDecoration(
            boxShadow: [
              BoxShadow(
                color: Colors.grey.withOpacity(0.3),
                spreadRadius: 15,
                blurRadius: 12,
                offset: Offset(3, 3), // changes position of shadow
              ),
              BoxShadow(
                color: Colors.deepOrange[900].withOpacity(1), spreadRadius: 3,
                blurRadius: 0,
                offset: Offset(-3, -3), // changes position of shadow
              ),
            ],
            borderRadius: BorderRadius.circular(20),
            color: Colors.deepOrange[700],
          ),
          child: SingleChildScrollView(
            dragStartBehavior: DragStartBehavior.down,
            child: Column(
              children: <Widget>[
                showDialog == true
                    ? AlertDialog(
                        content: Column(children: [
                          TextField(
                            decoration: InputDecoration(hintText: "Code"),
                            controller: Code,
                          ),
                          TextField(
                            decoration:
                                InputDecoration(hintText: "Provide Room name"),
                            controller: RoomName,
                          ),
                          TextField(
                            decoration: InputDecoration(
                                hintText: "Provide BUTTON1 name"),
                            controller: B1,
                          ),
                          TextField(
                            decoration: InputDecoration(
                                hintText: "Provide BUTTON2 name"),
                            controller: B2,
                          ),
                          TextField(
                            decoration: InputDecoration(
                                hintText: "Provide BUTTON3 name"),
                            controller: B3,
                          ),
                          TextField(
                            decoration: InputDecoration(
                                hintText: "Provide BUTTON4 name"),
                            controller: B4,
                          ),
                        ]),
                        actions: [
                          IconButton(
                              icon: Icon(Icons.add),
                              onPressed: () {
                                setState(() async {
                                  showDialog = false;
                                  name = RoomName.text;
                                  code = Code.text;
                                  b1 = B1.text;
                                  b2 = B2.text;
                                  b3 = B3.text;
                                  b4 = B4.text;

                                  var contact = new Contact(
                                    Code: code,
                                    RoomName: name,
                                    Button1: b1,
                                    Button2: b2,
                                    Button3: b3,
                                    Button4: b4,
                                  );
                                  var db = DataBaseHelper();
                                  await db.create(contact);
                                  print('id created ');
                                });
                              })
                        ],
                      )
                    : Text(''),
                FlatButton(
                  color: Colors.blue,
                  child: Text(name),
                  onLongPress: () {
                    setState(() {
                      showDialog = true;
                    });
                  },
                  onPressed: () {},
                ),
                SizedBox(
                  height: 40,
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  children: [
                    Flexible(
                      flex: 1,
                      child: RaisedButton(
                        shape: RoundedRectangleBorder(
                          borderRadius: new BorderRadius.circular(10.0),
                        ),
                        onLongPress: () {
                          showDialog = true;
                        },
                        onPressed: () {},
                        color: Colors.deepOrangeAccent[200],
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            Icon(
                              Icons.lightbulb,
                              color: Colors.yellow,
                              size: 90,
                            ),
                            Text(
                              b1,
                              textScaleFactor: 1,
                            )
                          ],
                        ),
                      ),
                    ),
                    Flexible(
                      flex: 1,
                      child: RaisedButton(
                        shape: RoundedRectangleBorder(
                          borderRadius: new BorderRadius.circular(10.0),
                        ),
                        onLongPress: () {
                          showDialog = true;
                        },
                        onPressed: () {},
                        color: Colors.deepOrangeAccent[200],
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            Icon(
                              Icons.lightbulb,
                              color: Colors.yellow,
                              size: 90,
                            ),
                            Text(
                              b2,
                              textScaleFactor: 1,
                            )
                          ],
                        ),
                      ),
                    ),
                  ],
                ),
                SizedBox(
                  height: 40,
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  children: [
                    Flexible(
                      flex: 1,
                      child: RaisedButton(
                        shape: RoundedRectangleBorder(
                          borderRadius: new BorderRadius.circular(10.0),
                        ),
                        onLongPress: () {
                          showDialog = true;
                        },
                        onPressed: () {},
                        color: Colors.deepOrangeAccent[200],
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            Icon(
                              Icons.lightbulb,
                              color: Colors.yellow,
                              size: 90,
                            ),
                            Text(
                              b3,
                              textScaleFactor: 1,
                            )
                          ],
                        ),
                      ),
                    ),
                    Flexible(
                      flex: 1,
                      child: RaisedButton(
                        shape: RoundedRectangleBorder(
                          borderRadius: new BorderRadius.circular(10.0),
                        ),
                        onLongPress: () {
                          showDialog = true;
                        },
                        onPressed: () {},
                        color: Colors.deepOrangeAccent[200],
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            Icon(
                              Icons.lightbulb,
                              color: Colors.yellow,
                              size: 90,
                            ),
                            Text(
                              b4,
                              textScaleFactor: 1,
                            )
                          ],
                        ),
                      ),
                    ),
                  ],
                ),
                SizedBox(
                  height: 40,
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  children: [
                    Flexible(
                      flex: 1,
                      child: RaisedButton(
                        shape: RoundedRectangleBorder(
                          borderRadius: new BorderRadius.circular(10.0),
                        ),
                        onLongPress: () {
                          showDialog = true;
                        },
                        onPressed: () {},
                        color: Colors.deepOrangeAccent[200],
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            Icon(
                              Icons.flip_camera_android_rounded,
                              color: Colors.yellow,
                              size: 30,
                            ),
                          ],
                        ),
                      ),
                    ),
                    Flexible(
                      flex: 1,
                      child: RaisedButton(
                        shape: RoundedRectangleBorder(
                          borderRadius: new BorderRadius.circular(10.0),
                        ),
                        onLongPress: () {
                          showDialog = true;
                        },
                        onPressed: () {},
                        color: Colors.deepOrangeAccent[200],
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            Icon(
                              Icons.flip_camera_android_rounded,
                              color: Colors.yellow,
                              size: 10,
                            ),
                          ],
                        ),
                      ),
                    ),
                    Flexible(
                      flex: 1,
                      child: RaisedButton(
                        shape: RoundedRectangleBorder(
                          borderRadius: new BorderRadius.circular(10.0),
                        ),
                        onLongPress: () {
                          showDialog = true;
                        },
                        onPressed: () {},
                        color: Colors.deepOrangeAccent[200],
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            Icon(
                              Icons.flip_camera_android_rounded,
                              color: Colors.yellow,
                              size: 10,
                            ),
                          ],
                        ),
                      ),
                    ),
                    Flexible(
                      flex: 1,
                      child: RaisedButton(
                        shape: RoundedRectangleBorder(
                          borderRadius: new BorderRadius.circular(10.0),
                        ),
                        onLongPress: () {
                          showDialog = true;
                        },
                        onPressed: () {},
                        color: Colors.deepOrangeAccent[200],
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            Icon(
                              Icons.flip_camera_android_rounded,
                              color: Colors.yellow,
                              size: 10,
                            ),
                          ],
                        ),
                      ),
                    ),
                  ],
                ),
              ],
            ),
          ),
        ));
  }
}


////////////////////////////////////////////////////////////
class ContentScreen extends StatefulWidget {
  @override
  _ContentScreenState createState() => _ContentScreenState();
}

class _ContentScreenState extends State<ContentScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: ListView(
        children: [
          Container(
            color: Colors.blue,
            child: FlatButton(
                onPressed: () {
                  setState(() {
                    var Widget = addWidget();
                    addWidget();
                    Navigator.push(context,
                        MaterialPageRoute(builder: (context) => HomeScreen()));
                  });
                },
                child: Icon(Icons.ac_unit)),
          ),
          Container(
            color: Colors.red,
            child: FlatButton(
                onPressed: () {
                  setState(() {
                    addWidget2();
                    Navigator.push(context,
                        MaterialPageRoute(builder: (context) => HomeScreen()));
                  });
                },
                child: Icon(Icons.ac_unit)),
          ),
          Container(
            color: Colors.green,
          ),
          Container(
            height: 80,
            color: Colors.yellow,
          ),
          Container(
            height: 80,
            color: Colors.brown,
          ),
        ],
      ),
    );
  }
}

应用重启后,它又回到初始状态

【问题讨论】:

    标签: flutter flutter-layout flutter-dependencies flutter-animation flutter-test


    【解决方案1】:

    默认情况下,Flutter 不会在应用重新启动时存储任何应用状态。解决您的问题的一种解决方案是使用 shared_preferences 颤振插件。使用它,您可以在应用重新启动时存储数据(在您的情况下应该显示哪些页面),在打开应用时再次获取数据并相应地构建您的 UI。

    【讨论】:

    • 第二张图片显示了动态小部件和应用栏上的“+”号,当我按下然后又添加了 1 个动态小部件,我可以通过滚动屏幕访问,但是当我重新启动应用程序时它变成空白。 Can share Preferences 有助于保持这一点。主屏幕上的动态小部件?
    • 是的,我相信您可以在共享首选项中实现一个简单的计数器,用于存储主屏幕上动态小部件的数量。每次添加或删除新的动态小部件时,您只需增加或减少它的值。当应用程序重新启动时,您现在可以访问动态小部件的数量,您只需想办法让它们出现在屏幕上,可能是通过 if 子句或 for 循环(如前所述,我真的不知道理解你的代码)。
    • 我正在制作一个家庭自动化应用程序,我的想法是,当我按下 appbar 上的 + 按钮时,它导航到自动化产品列表,我选择其中一个产品,该产品的控件出现在主屏幕。我做了所有这些东西!但是卡在最后一件事上,即当我重新启动应用程序时,所有东西都消失了!!!
    • 抱歉,我无法更好地帮助您解决问题。您必须具有本地持久性才能在应用程序启动时存储数据。这是共享偏好的教程 (youtube.com/watch?v=uyz0HrGUamc) 和 Medium 的文章 (medium.com/swlh/local-data-persistence-in-flutter-7f82c54efe5),也许其中一篇会对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2013-02-16
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多