2017-08-19 15 views
0

今はFlutter/Dartで試しています。しかし、私の静的変数は、別のクラスからアクセスされたときに再初期化され続けます。フラッター/ダーツ静的変数の損失/再初期化の継続

私は、サーバーの状態を保持し、その別のダーツのソースファイルで、クラスを持っているが、そのように宣言:

class ServerStatus{ 
    static int newestBinary; 
    static bool serverUp; 
} 

私は

ServerStatus.newestBinary = 20; 
ServerStatus.serverUp = true; 

によってmain() @それらを初期化。その後、私のアプリケーションの別のページでそれらにアクセスしようとすると、変数 'newestBinary'と 'serverUp'はともに再活性化されたようにnullになりました。 (私はその後、main()ServerStatus.newestBinary = 20;を再割り当て、static int newestBinary = 10;のようにそれらを宣言すると、それはまだ私のアプリケーション内の別のページに10として表示されます。

私のアプリケーションは終了していなかったか、2つの操作の間停止する。どのような状況下では、変数を静的うreinitalisedこと?

を私は静的変数を使用した以外のそれを行うための最善の方法どのようになるか、アプリケーションのグローバルおよび一般的に使用される情報を保持する必要がある場合は?

事前に感謝を。

+1

これはほとんどありません。値の初期化と読み込み方法と場所を示すコードを追加してください。唯一の考えは、ホットリロード(コードの変更後)によって引き起こされる可能性があるということです。 –

+0

私は、ここにアップロードするために私のコードを整理していましたが、それは理由があるように見えました。それは、インポートステートメントです。私は以下の答えを私が意味するものを詳しく述べるために追加します。ご協力ありがとうございました! – Live0

答えて

0

することができます静的を初期化する変数を直接宣言に追加します。このような 何かが良いだろう。

class ServerStatus{ 
    static int newestBinary = 20; 
    static bool serverUp = false; 
} 

また、あなたはあなたの逢引が正しく実行されていることを確認し、何か他のものの前にありますか?それ以上のコードがなければ、完全な答えを与えることは非常に難しいでしょう。

あなたの割り当て方法についてのもう1つの理由があります。 newestBinary = 20;またはServerStatus.newestBinary = 20;をやっていますか? 静的変数はグローバル変数とは異なります。 newestBinary = 20;を実行すると、ServerStatusの静的変数ではなくローカル変数が変更されます。

+0

さて、私はServerStatus.newestBinary = 20をやっています。混乱をおかけして申し訳ありません。変数が実際にサーバーから取得する情報を保持しているので、私は宣言ですぐに初期化することはできません。 私は他のすべての言語(そしてFlutterなしのダーツ)でいつもやっていることをしているので、コードライフサイクルよりもアプリケーションライフサイクルと関係があると思います。それは正常に動作します。 – Live0

3

私は1時間ぐらい遊んで、その理由が分かります。私はどうやらとき:

import 'package:flutter_test_app/main.dart'; 

両方のソースファイルは、同じパッケージに属している場合であっても

import 'main.dart'; 

は異なっています。

main.dart:

import 'package:flutter/material.dart'; 
import 'pageA.dart'; 
import 'pageB.dart'; 
import 'pageH.dart'; 

void main() { 
    runApp(new MyApp()); 
} 

class MyApp extends StatelessWidget { 

    static bool testFlag = false; 
    // This widget is the root of your application. 
    @override 
    Widget build(BuildContext context) { 

    testFlag = true; 
    ThemeData mainTheme = new ThemeData(
     primarySwatch: Colors.cyan, 
    ); 
    print("testFlag @ MyApp: " + testFlag.toString()); 
    MaterialApp mainApp = new MaterialApp(
     title: 'Instabazaar', 
     theme: mainTheme, 
     home: new HomePage(title: 'Instabazaar'), 
    ); 

    return mainApp; 
    } 
} 

class HomePage extends StatefulWidget { 

    final String title; 
    HomePage({Key key, this.title}) : super(key: key); 

    @override 
    _HomePageState createState() { 

    return new _HomePageState(); 
    } 
} 

class _HomePageState extends State<HomePage> { 
    int _currentPageID = 0; // 0=home, 1=pageA, 2=pageB 



    @override 
    Widget build(BuildContext context) { 

    print("testFlag @ HomePage: " + MyApp.testFlag.toString()); 


    AppBar appBar = new AppBar(
     title: new Text("TestApp"), 
     centerTitle: true, 
    ); 

    BottomNavigationBar bottomNavigationBar = new BottomNavigationBar(
     type: BottomNavigationBarType.shifting, 
     items: <BottomNavigationBarItem>[ 
      new BottomNavigationBarItem(icon: new Icon(Icons.home), title: new Text('Home'), backgroundColor: Theme.of(context).accentColor), 
      new BottomNavigationBarItem(icon: new Icon(Icons.explore), title: new Text('PageA'), backgroundColor: Colors.purple), 
      new BottomNavigationBarItem(icon: new Icon(Icons.star), title: new Text('PageB'), backgroundColor: Colors.redAccent), 
     ], 
     onTap: (i) => setState(() => _currentPageID = i), 
     currentIndex: _currentPageID 
    ); 


    Scaffold mainScaffold = new Scaffold(
     appBar: appBar, 
     body: _getNewSubPage(), 
     bottomNavigationBar: bottomNavigationBar, 
    ); 
    return mainScaffold; 
    } 


    //MARK: navigation 


    Widget _getNewSubPage(){ 
    switch (_currentPageID) 
    { 
     case 1: 
     return new pageA(); 
     case 2: 
     return new pageB(); 
     default: 
     return new pageH(); 
    } 
    } 


} 

pageA.dart/pageB.dart:

import 'package:flutter/material.dart'; 
import 'package:flutter_test_app/main.dart'; 

class pageA extends StatefulWidget{ 
    pageAState createState() => new pageAState(); 
} 


class pageAState extends State<pageA> { 

    @override 
    Widget build(BuildContext context) { 
    print("testFlag @ pageA: " + MyApp.testFlag.toString()); 
    return new Container(); 
    } 
} 

pageH.dart:

だから最後に私のテストコードは次のようになります

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

class pageH extends StatefulWidget{ 
    pageHState createState() => new pageHState(); 
} 


class pageHState extends State<pageH> { 
    @override 
    Widget build(BuildContext context) { 
    print("testFlag @ pageH: " + MyApp.testFlag.toString()); 
    return new Container(); 
    } 
} 

唯一の違いは、インポートステートメント。しかし、pageA/pageBの場合、printステートメントは "false"を返します。 pageHについては、printステートメントは "true"を返します。私は輸入声明を交換し、それをチェックアウトします。私はダーツが実際にコードをどのように解釈するかに精通していないので、ダーツのものかセットアップのものか不安なものかはわかりません。私は調査を続けますが、今のところ私の問題は解決されています。

皆様のご協力ありがとうございます。

+0

興味深い。私のバグのように聞こえる。ダーツはそれを違うものとして扱うべきではありません。それは適切に標準化できるはずです。 –

+0

はい、問題を提出してください。 https://github.com/dart-lang/sdk/issues/new –

0

"package:your_app_package/file.dart"でインポートが開始された場合、FlutterとDartは静的(グローバル)変数に対して同じインスタンスを見つけることが問題になります。

したがって、MyAppクラスを持つmain.dartファイルに静的変数(myStaticVariable)を設定したいとしましょう。そして、その静的変数をMyApp.myStaticVariableで呼び出すことで、プロジェクト内のいくつかの異なる.dartファイルに入れたいとします。

"import package:your_app_package/main.dart"を指定してmain.dartをインポートすると、その変数は以前に初期化されていても "null"値を持ちます!

"main.dartをインポートする"(ファイルが同じディレクトリにある場合)または "import ../main.dart"(ファイルがディレクトリディッパである場合はmain.dart )、MyApp.myStaticVariableに適切な値が得られます。

私は理由は分かりませんが、@Kevin Mooreが言及したように、問題があり、Flutterチームが解決する必要があります。

+0

これはFlutterの唯一の問題です。エントリポイントが 'lib'にあり、otherwuseが' lib'の外側にあるかもしれないからです( 'bin'、ウェブ '、...) –

関連する問題