Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在具有共享首选项的Flatter应用程序中存储用户数据_Flutter_Validation - Fatal编程技术网

Flutter 如何在具有共享首选项的Flatter应用程序中存储用户数据

Flutter 如何在具有共享首选项的Flatter应用程序中存储用户数据,flutter,validation,Flutter,Validation,我想将基本用户数据(姓名和电子邮件)存储在我的颤振应用程序中(使用共享首选项),并且我想使用这些数据来确定我应该显示启动屏幕还是主屏幕。我试图使用三元运算符查看共享首选项是否包含名称(如果是,则转到主屏幕,否则显示初始屏幕)。我正在分享我的主文件和我的表单代码,所以请帮助我做这件事,或者建议一些其他的方式,因为我对此非常陌生 final val = _readName(); void main() { WidgetsFlutterBinding.ensureInitialized();

我想将基本用户数据(姓名和电子邮件)存储在我的颤振应用程序中(使用共享首选项),并且我想使用这些数据来确定我应该显示启动屏幕还是主屏幕。我试图使用三元运算符查看共享首选项是否包含名称(如果是,则转到主屏幕,否则显示初始屏幕)。我正在分享我的主文件和我的表单代码,所以请帮助我做这件事,或者建议一些其他的方式,因为我对此非常陌生

final val = _readName();
void main() {
  WidgetsFlutterBinding.ensureInitialized();
  _saveEmpty();
  print(val);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'My Title',
      theme: ThemeData(
        textTheme: GoogleFonts.poppinsTextTheme(Theme.of(context).textTheme),
        primaryColor: kPrimaryColor,
        accentColor: kPrimaryColor,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: val != "a" ? HomeScreen() : SplashScreen(),
    );
  }
}

_readName() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  final value = prefs.getString("myName");
  print(value);
  return value;
}

_saveEmpty() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setString("myName", "a");
}

表格:


我想使用共享首选项,因为数据库对我来说很复杂,所以请帮助我。谢谢

我建议的实现方法是在显示启动屏幕时检查共享首选项状态,然后根据结果将用户导航到主屏幕或登录屏幕

下面是如何做到这一点

  • 创建用于输入用户数据和主页的单独屏幕
  • 在主应用程序中将下面的splashscreen类添加为home
  • 当用户保存输入的数据时,将“是否登录”值保存为true
  • 在显示启动屏幕时检查“是否已登录”值,并相应导航

溅屏 更新:
我使用的preferences常量类应该是这样的, 此值用作存储我们保存的首选项值的键

class Preferences {
  Preferences._();

  static const String is_logged_in = "isLoggedIn";
}

这回答了你的问题吗?你的方法出了什么问题?谢谢回复!在get bool中,您已经用大写字母P编写了首选项,但它对我不起作用。它显示了一个错误。是打字错误还是我应该在某处声明?不客气:),我已经更新了答案。Preferences类是我创建的一个类,用于存储SharedReferences的键值。如果您认为我的答案正确且有用,您是否可以接受我的答案为正确;)谢谢你的回复,我已将其标记为正确。非常感谢。
class SplashScreen extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen> {
  @override
  void initState() {
    super.initState();
    startTimer();
  }

  @override
  Widget build(BuildContext context) {

    return Material(
      child: Center(child: AppIconWidget(image: Assets.appLogo)),
    );
  }

  startTimer() {
    var _duration = Duration(milliseconds: 2000);
    return Timer(_duration, navigate);
  }

  navigate() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();

    if (preferences.getBool(Preferences.is_logged_in) ?? false) {
      Navigator.of(context).pushNamed(Routes.home);
    } else {
      Navigator.of(context).pushNamed(Routes.login);
    }
  }
}
home: SplashScreen()
class Preferences {
  Preferences._();

  static const String is_logged_in = "isLoggedIn";
}