通过 NavDrawer 导航更改设置后刷新 Flutter 屏幕的最佳方法

时间:2021-07-19 17:29:54

标签: flutter

在我的应用程序中,我有一个基本的 NavDrawer,它允许用户导航到“设置”页面以更改对数据列表的显示方式(按频率或按距离)进行排序的设置。该设置更改了主屏幕检查的 SharedPreferences。但是,我正在努力弄清楚如何在单击“设置”屏幕中的后退按钮时重新加载主屏幕以反映数据排序方式的设置是否已更改。

这是有问题的行为的粗略 GIF(您会注意到,尽管设置被更改,主屏幕上的数据顺序保持不变。如果我停止并重新启动模拟器,数据顺序会改变。)我目前有设置屏幕弹出两次,否则它只会返回到打开的 NavDrawer。

GIF of behavior

相关代码。调用 NavDrawer 的主屏幕:

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver  {
  Position? _currentPosition;
  HelperFunctions helperFunctions = new HelperFunctions();
  int? val = -1;

  @override
  void initState() {
    _getCurrentLocation();

    super.initState();
    WidgetsBinding.instance!.addObserver(this);
  }

  @override
  void didChangeAppLifecycleState(final AppLifecycleState state) {
    if (state == AppLifecycleState.resumed) {
     
      helperFunctions.getSettingsPref().then((value) => setState(() {
        val = value!;

      }));
    }}


    _HomeScreenState(){
    helperFunctions.getSettingsPref().then((value) => setState(() {
      val = value!;

    }));}

  @override
  Widget build(BuildContext context) {
    final api = Provider.of<WtfdaApi>(context, listen: false);
    return Scaffold(
      drawer: NavDrawer(),
      appBar: AppBar(
        centerTitle: true,
        backgroundColor: Colors.red,
        title: Text("Welcome to RadioLand"),
      ),

NavDrawer 本身:

class NavDrawer extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: ListView(
        padding: EdgeInsets.zero,
        children: <Widget>[
          DrawerHeader(
            child:ConstrainedBox(
              constraints:
              BoxConstraints(minWidth: 10, minHeight: 10),
              child:
              Image.asset("images\/" + "wtfda1.jpg",
                width: 70,
                height: 70,


              ),
            ),

          ),
          ListTile(
            leading: Icon(Icons.house_sharp),
            title: Text('Current Location FM Dial'),
            onTap: () => {Navigator.of(context).pop()},
          ),
          ListTile(
            leading: Icon(Icons.location_city),
            title: Text('Search FM Dial by US location'),
            onTap: () => {Navigator.pushNamed(context, 'LocationSearchScreen')},
          ),
          ListTile(
            leading: Icon(Icons.headphones_battery),
            title: Text('Search by Call Letters'),
            onTap: () => {Navigator.pushNamed(context, 'SearchScreen')},
          ),
          ListTile(
            leading: Icon(Icons.imagesearch_roller),
            title: Text('Settings'),
            onTap: () => {Navigator.pushNamed(context, 'SettingsScreen')},
          ),
          ListTile(
            leading: Icon(Icons.people_sharp),
            title: Text('About The App'),
            onTap: () => {Navigator.pushNamed(context, 'AboutTheTeam')},
          ),

        ],
      ),
    );
  }
}

和设置屏幕:

class SettingsScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final appTitle = 'Toggle Search Settings';

    return Scaffold(
      appBar: AppBar(
        title: Text(appTitle),
leading: new IconButton(
  icon: new Icon(Icons.arrow_back),
  onPressed: () {
    int count = 0;
    Navigator.of(context).popUntil((_) => count++ >= 2);
  },
),

      ),
      body: SettingsToggle(),
    );

  }
}


class SettingsToggle extends StatefulWidget {
  @override
  SettingsToggleState createState() {
    return SettingsToggleState();
  }
}

// Create a corresponding State class.
// This class holds data related to the form.
class SettingsToggleState extends State<SettingsToggle > {
 
  List<String> sendToNutritionist = <String>[];
  bool _value = false;
  int? val = -1;
  HelperFunctions helperFunctions = new HelperFunctions();



  SettingsToggleState(){
    helperFunctions.getSettingsPref().then((value) => setState(() {
      val = value!;

    }));}





  @override
  Widget build(BuildContext context) {
    final int count = 4;



    return Scaffold(
      body:Column(
        mainAxisAlignment: MainAxisAlignment.start,
        children: [
          ListTile(
            title: Text("Distance"),
            leading: Radio(
              value: 1,
              groupValue: val,
              onChanged: (value) {
                setState(() {
                  val = value as int?;
                  _storeLimitPref(value!);
                });
              },
              activeColor: Colors.green,
            ),
          ),
          ListTile(
            title: Text("Frequency"),
            leading: Radio(
              value: 2,
              groupValue: val,
              onChanged: (value) {
                setState(() {
                  val = value as int?;
                  _storeLimitPref(value!);
                });
              },
              activeColor: Colors.green,
            ),
          ),
        ],
      ));
  }
}



void _storeLimitPref(int preference) async {
  SharedPreferences preferences = await SharedPreferences.getInstance();
  preferences.setInt("settings", preference);
}

0 个答案:

没有答案