颤动:从另一条路线刷新另一个小部件状态

问题描述 投票:0回答:1

在HompePage,我正在导航到设置页面;

 Navigator.push(
      context,
      new MaterialPageRoute(
          builder: (BuildContext context) => Settings()));

Settings()页面包含一个int输入,允许用户指定他们想要在HomePage上看到的帖子数量。当用户输入数字和form.save时,该值存储在SharedPreferences中。但是当用户回到HomePage时,帖子的初始数量仍然存在。我希望HomePagestate能够刷新,以便用户在“设置页面”中指定的帖子数量会立即生效,并保存表单。

以下是我的代码的一些片段;

这是_submit页面上的Settings()形式,

_submit() async {
    final form = _formKey.currentState;
    SharedPreferences prefs = await SharedPreferences.getInstance();
    if (form.validate()) {
      prefs.setInt('defaultField', newva);
      form.save();
      final mysb = SnackBar(
        duration: Duration(seconds: 1),
        content: new Text(
          'Data Saved Successfully',
          style: TextStyle(
            color: Colors.white,
            fontWeight: FontWeight.bold,
          ),
        ),
        backgroundColor: Colors.red,
      );
      _scaffoldKey.currentState?.showSnackBar(mysb);
      myHomePageState.setState(() {
        newSULength = newva;
      });
      print('Done for $newva');
    }
  }

这是我的MyHomePage()

MyHomePageState myHomePageState = new MyHomePageState();

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  State<MyHomePage> createState() => new MyHomePageState();
  static MyHomePageState of(BuildContext context){
    final MyHomePageState navigator = context.ancestorStateOfType(const TypeMatcher<MyHomePageState>());
    assert(() {
      if(navigator == null) {
        throw new FlutterError('Error occoured');
      }
      return true;
    }());

    return navigator;
  }
}

class MyHomePageState extends State<MyHomePage> {

  int newSULength = 0;

void initState() {
    // TODO: implement initState
    super.initState();
    loadDF();
  }

  set newle(String value) => setState(() => _string = value);


  loadDF() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      newSULength = (prefs.getInt('defaultField') ?? 5);
      for (int i = 0; i < newSULength; i++) {

\\todos
      }
    });
    print('Done');
  }
}
dart flutter
1个回答
0
投票

您可以使用callbacks来指示HomePage页面在共享首选项中更改了某个值。请参阅Settings

© www.soinside.com 2019 - 2024. All rights reserved.