繁体   English   中英

如何在本地保存用户名并在每个页面颤动中显示

How to save a username locally and display it in every page flutter

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我试图在我制作的 flutter 应用程序的每个页面中添加一个用户名。 我的意思是在我的页面的 sidedrawers 中我是新手,所以我在这方面遇到了很大的困难来帮助我

我尝试使用共享首选项,但我不能像变量所说的那样做,因为它是一个未来的字符串。 我让它在一个人登录时保存用户名,当我试图找回它时它起作用了,我不能

  Future<String> getuname() async {
    final prefs = await SharedPreferences.getInstance();
    final name = "username";
    var user = prefs.getString(name);
    var username = '${user[0].toUpperCase()}${user.substring(1)}';
    print('get $username');
    return username;
  }

我把这个添加到 sidedrawer

ListTile(
              leading: Icon(Icons.user),
              title: Text(_get()),
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => MyProfilePage()),
                );
              }),
  String uname = '';
  @override
  void initState() {

    getuname().then((value) {
    setState(() {
      uname = value;
    });
  });
    _selectedDay = DateTime.now();
    _events = {
      _selectedDay.subtract(Duration(days: 30)): ['Event A0', 'Event B0', 'Event C0'],
      _selectedDay.subtract(Duration(days: 27)): ['Event A1'],
      _selectedDay.subtract(Duration(days: 20)): ['Event A2', 'Event B2', 'Event C2', 'Event D2'],
      _selectedDay.subtract(Duration(days: 16)): ['Event A3', 'Event B3'],
      _selectedDay.subtract(Duration(days: 10)): ['Event A4', 'Event B4', 'Event C4'],
      _selectedDay.subtract(Duration(days: 4)): ['Event A5', 'Event B5', 'Event C5'],
      _selectedDay.subtract(Duration(days: 2)): ['Event A6', 'Event B6'],
      _selectedDay: [uname, 'Event B7', 'Event C7', 'Event D7'],
      _selectedDay.add(Duration(days: 1)): ['Event A8v', 'Event B8', 'Event C8', 'Event D8'],
      _selectedDay.add(Duration(days: 3)): Set.from(['Event A9', 'Event A9', 'Event B9']).toList(),
      _selectedDay.add(Duration(days: 7)): ['Event A10', 'Event B10', 'Event C10'],
      _selectedDay.add(Duration(days: 11)): ['Event A11', 'Event B11'],
      _selectedDay.add(Duration(days: 17)): ['Event A12', 'Event B12', 'Event C12', 'Event D12'],
      _selectedDay.add(Duration(days: 22)): ['Event A13', 'Event B13'],
      _selectedDay.add(Duration(days: 26)): ['Event A14', 'Event B14', 'Event C14'],
    };

    _selectedEvents = _events[_selectedDay] ?? [];
    _visibleEvents = _events;
    _visibleHolidays = _holidays;

    _controller = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 400),
    );

    _controller.forward();

    super.initState();
  }

我无法获得用户名的值,但它可以在小部件中使用,但不能在 initstate 中使用。 帮我

4 个回复

SharedPreferences 适合存储数据,但正如您所见,它不适用于任何地方——主要问题是它需要异步加载。 您可以在应用程序开始运行时简单地获取它,然后将它传递到您需要的任何地方,但这并不是特别理想。

我在我的应用程序中所做的,感觉有点像作弊,但到目前为止效果很好,是将 SharedPreferences 包装到ScopedModel 包中的模型中。

这使我可以编写一些非常方便的包装器。 由于从作用域模型中获取数据是同步的,因此使用 SharePreferences 非常容易。

看起来像这样:

abstract class _PreferenceKeys {
  static const USERNAME = 'username';
}

class PreferenceModel extends Model {
  static PreferenceModel of(BuildContext context, {bool rebuildOnChange = false}) => ScopedModel.of<PreferenceModel>(context, rebuildOnChange: rebuildOnChange);


  final SharedPreferences sharedPreferences;

  PreferenceModel(this.sharedPreferences);

  // Helpers to set in values which ensure that notifyListeners gets called
  Future<bool> _setString(String key, String value, {bool notify = true}) async {
    final val = await sharedPreferences.setString(key, value);
    if (notify) notifyListeners();
    return val;
  }
  Future<bool> _setBool(String key, bool value, {bool notify = true}) async {
    final fut = await sharedPreferences.setBool(key, value);
    if (notify) notifyListeners();
    return fut;
  }

  String get username => sharedPreferences.getString(_PreferenceKeys.USERNAME);

  void set username(String username) => _setString(_PreferenceKeys.USERNAME, userName);

这种方法的最大缺点是 _setString 方法中的任何错误都不会传播回来 - 如果这是您想要处理的问题,您可以使用 Future 函数来设置用户名,或者在 _setString 中做一些事情来处理它。 不过我个人没有遇到任何问题。

还有一个与此相关的技巧。 您可以使应用程序的主要功能异步,这意味着您可以这样做:

main() async {
  final sharedPreferences = await SharedPreferences.getInstance();

  runApp(
    ScopedModel<PreferenceModel>(
      model: PreferenceModel(sharedPreferences),
      child: ...
    ),
  )
}

然后在你的代码中使用它,你可以简单地使用:

PreferenceModel.of(context).userName

 or

PreferenceModel.of(context, rebuildOnChange: true).userName

or

child: ScopedModelDescendant<PreferenceModel>(
  child: ...
  builder: (context, model, child) {
    // do whatever with model
    return ...
  }
)

如果您想完全按照自己的方式进行操作 - 您可以将Text包装在FutureBuilder

Future<String> _get() async {
    final prefs = await SharedPreferences.getInstance();
    final name = "username";
    var username = prefs.getString(name);
    return username;
  }

ListTile(
  title: FutureBuilder(builder: (context, snapshot) {
    if (snapshot.hasData) return Text(snapshot.data);
    else return Text('');
  }, future: _get(),),.....),

更新:

用于在变量中保存名称

String name = '';

@override
void initState() {
  super.initState();
  _get().then((value) {
    setState(() {
      name = value;
    });
  });
}

您可以做的是在 initstate 中您获取数据并使用“then”关键字为变量分配一个用户名,并在整个存储中使用该变量,并在“then”中构建您的应用程序。 它会等到您获得数据,然后构建您的应用程序

为什么不使用安全存储插件?

// Create storage
final storage = new FlutterSecureStorage();

// Read value 
String value = await storage.read(key: key);

// Read all values
Map<String, String> allValues = await storage.readAll();

// Delete value 
await storage.delete(key: key);

// Delete all 
await storage.deleteAll();

// Write value 
await storage.write(key: key, value: value);
1 如何安全地保存用户名/密码(本地)?

我正在制作一个 Windows 应用程序,您需要先登录。 账户信息由用户名和密码组成,需要保存在本地。 这只是安全问题,因此使用同一台计算机的其他人无法看到每个人的个人数据。 保存这些数据的最佳/最安全的方法是什么? 我不想使用数据库,所以我尝试了一些资源文件。 但是由于我对此有点陌生,所以我并不 ...

2 保存用户名,并在其他页面上显示

我很难设置一种捕获用户名以显示在其他页面上的方法。 此代码在azure简易表上进行身份验证并创建新用户。 在问过之前,我只能获得此代码无效的几个突变。 任何建议或编辑表示赞赏。 该页面位于主页上,但下一页的下一个代码块无法读取。 下一页有 ...

3 如何在每个页面的标题上显示用户名?

我陷入了一个问题。 我想在每个页面的标题上显示“ Welcome Username”,尤其是“ .html”页面。 由于它是一个html页面,所以我认为我不能使用PHP。 另外,我希望它能在没有JavaScript的情况下正常工作。 因此,在概述中:-在html页面(.html)的标 ...

5 Codeigniter:如何在每个方法(或查看页面)中显示登录的用户名,而无需在每个函数中重复相同的代码

我试图通过在会话中存储数据来在每个视图页面中显示登录的用户名。 但是我必须在每个函数中写相同的两行。我正在获取用户数据,但是还有其他方法可以做到这一点。 因为我认为重复相同的代码不太好。 控制者 因此,这是我的索引函数,在这里我有电子邮件,还有一个用于从数据库获取用户数据的 ...

6 Google Chrome不正确地保存用户名

首先,我没有试图绕过浏览器的自动完成功能。 乐于自动完成以保存并填充密码。 我的表格包含3个输入 数量 电话号码(可选) 密码 当前提交时,数量或电话号码将保存为用户名。 理想情况下,我将保存用户的电子邮件地址。 但是,这不是表单的一部分,我不希望它 ...

10 PHP在每个页面的顶部显示登录的用户名

我正在建立一个学院黑板类型的应用程序,我有一个处理授权的PHP文件。 我使用javascript ajax post将数据发送到服务器和中间的php以回应响应。 然后我重定向到主页。 我无法弄清楚如何从初始页面保存用户名并显示logged in as 'username'的重定向页面的 ...

2013-03-07 07:28:08 2 1939   php
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM