[Flutter]Flutter Dart 静态变量值为null的bug

Flutter还在学习中,我是以开发一个小的App来学习的,昨天做到一个需求是用户登录后用一个static的变量来缓存登录用户的信息。变量的赋值什么的都没有问题,可是当我在另一个页面想使用这个static的变量的时候,发现它神奇的变成了null。

这个坑爹的问题让我改了很多代码,然而并没有什么卵用,最后不知道是什么促使我google了一下这个关键字“flutter static object value lost”,还真是dart的坑。

可以看一下这个issuse:https://github.com/dart-lang/sdk/issues/32601

原因

dart导入文件的时候可以用相对路径,也中以用package路径,像下面这样:

import 'static_value.dart' as staticA;
import 'package:flutter_study/static_value/static_value.dart' as staticB;

坑爹的地方就在这里,当你用上面两种方式导入同一个dart文件的时候,其实你得到的是使用同一份源代码的两个不同的library

测试一下

新建一个static_value.dart文件,代码如下:

class StaticValue {
  static int testStaticInt;
}

在另一个页面里面用不同的方式导入这个文件,再修改这个testStaticInt变量的值,查看输出结果:

import 'package:flutter/material.dart';
import 'static_value.dart' as staticA;
import 'package:flutter_study/static_value/static_value.dart' as staticB;

class StaticValuePage extends StatefulWidget {

  @override
  State<StatefulWidget> createState() {
    return new StaticValuePageState();
  }
}

class StaticValuePageState extends State<StaticValuePage> {

  @override
  void initState() {
    super.initState();

    staticA.StaticValue.testStaticInt = 1;
    print('staticA: ${staticA.StaticValue.testStaticInt}    staticB:${staticB.StaticValue.testStaticInt}');

    staticB.StaticValue.testStaticInt = 2;
    print('staticA: ${staticA.StaticValue.testStaticInt}    staticB:${staticB.StaticValue.testStaticInt}');

  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text('静态变量'),
        ),
        body: Center(
          child: Text(''),
        ));
  }
}

输出结果如下,真的是惊喜意外到想哭。

flutter: staticA: 1    staticB:null
flutter: staticA: 1    staticB:2

解决

这个文件就以一种方式引入

关于Flutter学习

flutter的学习文章及代码都整理在这个github仓库

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【专业技术】揭秘安卓浏览器如何注入javascript脚本

Android中向webview注入js代码可以通过webview.loadUrl("javascript:xxx")来实现,然后就会执行javascript后...

5364
来自专栏积累沉淀

shell脚本学习之必须了解的基础命令

命令历史 history !! 表示执行上一条命令 !n  表示执行历史中第n条命令 !字符串  表示执行命令历史中首次出现该字符串的命令 设置别名:...

1899
来自专栏landv

CMD批处理——forfiles命令使用,自动删除过期备份文件

2401
来自专栏北京马哥教育

高性能HTTP加速器Varnish(安装配置篇)

一、安装Varnish Varnish的安装非常简单,下面逐步介绍: 1、安装前的准备 Varnish安装环境如下表1所示: 表1 主机名 操作系统 IP地址...

3226
来自专栏专注 Java 基础分享

线程的基本概念

按照规划,从本篇开始我们开启『并发』系列内容的总结,从本篇的线程开始,到线程池,到几种并发集合源码的分析,我们一点点来,希望你也有耐心,因为并发这块知识是你职业...

1192
来自专栏Spark学习技巧

Kafka源码系列之如何删除topic

本文依然是以kafka0.8.2.2为例讲解 一,如何删除一个topic 删除一个topic有两个关键点: 1,配置删除参数 delete.topic.enab...

4529
来自专栏性能与架构

腾讯前端首屏优化案例

下面是对腾讯前端团队优化手Q一个页面案例的总结 优化目标页面:手Q群成员分布的页面 ? 左面是首屏,右面是下拉后到底部 这个页面中,可以划分成四个部份:活跃...

37710
来自专栏用户2442861的专栏

linux动态库和静态库

http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520101023104745738/

5222
来自专栏前端儿

Node.js起步 -- (1)

  我们知道JavaScript是运行在浏览器中的,浏览器为它提供了一个上下文(context),从而让JavaScript得以解析执行。

1612
来自专栏芋道源码1024

Nginx基础——Rewrite规则

rewrite是nginx一个特别重要的指令,该指令可以使用正则表达式改写URI。可以指定一个或多个rewrite指令,按顺序匹配。

1041

扫码关注云+社区

领取腾讯云代金券