具有共享首选项的值为3的Flutter下拉项目

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

您好,我使用共享的首选项和下拉菜单将屏幕值保存在应用程序中,但是在添加共享的首选项代码后,它显示以下错误,但是如果删除共享的首选项代码,则下拉列表可以正常工作。没有共同的想法,下拉列表就可以正常工作。但是在我添加共享偏好代码以保存我的下拉值之后,就会出现此错误。This is error show in my app

这是我的完整代码

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class HomeView extends StatelessWidget {
  const HomeView({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(body: DropPage());
  }
}

class DropPage extends StatefulWidget {
  @override
  _DropPageState createState() => _DropPageState();
}

class _DropPageState extends State<DropPage> {
  String _selectedGender = 'FYJC';
  SharedPreferences prefs;
  final _key = 'cur_r';

  @override
  void initState() {
    super.initState();
    _read(); // read in initState
  }

  _read() async {
    prefs = await SharedPreferences.getInstance();
    setState(() {
      _selectedGender = prefs.getString(_key) ?? "FYJC"; // get the value
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('First Screen'),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            DropdownButton(
              value: _selectedGender,
              items: _dropDownItem(),
              onChanged: (value) {
                setState(() {
                  _selectedGender = value;
                });
                prefs.setString(
                    _key, _selectedGender); // save value to SharedPreference

                _selectedGender = value;
                switch (value) {
                  case "FYJC":
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => SecondScreen()),
                    );
                    break;
                  case "SYJC":
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => SecondScreen()),
                    );
                    break;
                  case "FYBCOM":
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => SecondScreen()),
                    );
                    break;
                  case "SYBCOM":
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => SecondScreen()),
                    );
                    break;
                  case "TYBCOM":
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => SecondScreen()),
                    );
                    break;
                }
              },
              hint: Text('Select Cource Year'),
            ),
          ],
        ),
      ),
    );
  }

  List<DropdownMenuItem<String>> _dropDownItem() {
    List<String> ddl = [
      "FYJC",
      "SYJC",
      "FYBCOM",
      "SYBCOM",
      "TYBCOM",
    ];
    return ddl
        .map((value) => DropdownMenuItem(
              value: value,
              child: Text(value),
            ))
        .toList();
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Screen"),
      ),
      body: Center(
        child: RaisedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Go back!'),
        ),
      ),
    );
  }
}


flutter flutter-layout
1个回答
0
投票

我无法使用给定的代码重现错误。您能否更具体地说明何时发生错误?

Your code sample from above

也许这会帮助link

 _read() async {
    prefs = await SharedPreferences.getInstance();
    setState(() {
      final cachedValue = prefs.getString(_key);
      if(cachedValue != null)
        _navigate(cachedValue);

      _selectedGender = cachedValue ?? "FYJC"; // get the value
    });
  }
 ...

void _navigate(value) {
    switch (value) {
      case "FYJC":
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SecondScreen()),
        );
        break;
      case "SYJC":
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SecondScreen()),
        );
        break;
      case "FYBCOM":
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SecondScreen()),
        );
        break;
      case "SYBCOM":
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SecondScreen()),
        );
        break;
      case "TYBCOM":
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SecondScreen()),
        );
        break;
    }
  }

这种方法存在问题。

我认为最好使用这样的东西:

home: expression ? DropPage() : SelectedPage(),
© www.soinside.com 2019 - 2024. All rights reserved.