【解決方法】Flutter が別の関数からのグローバル変数の変更を検出しない

[ad_1]

データベースからユーザー名を取得する関数があり、そのユーザー名の値はグローバル文字列変数に格納されます。すべてが機能し、私の目標はそのユーザー名変数を AppBar テキストに表示することですが、「Null はサブタイプ タイプではありません。文字列」エラー。

これがメインクラス

String _custUsername = "";

// User will be redirect to this page after logged-in
class _cakeHomeWidgetState extends State<cakeWidget> { 

  BuildContext? dialogContext;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: setupMainTheme,
      appBar: PreferredSize(
        preferredSize: Size.fromHeight(58),
        child: AppBar(
          centerTitle: false,
          title: Column(
            children: <Widget>[
             Text(setupTime(),
                style: 
                  TextStyle(
                    color: Color.fromARGB(255, 190, 190, 190),
                    fontWeight: FontWeight.w700,
                    fontSize: 20
                    )
                ),
            ], 
          ),
          automaticallyImplyLeading: false,
          backgroundColor: setupMainTheme,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.vertical(
              bottom: Radius.circular(12)),
            ),
        ),
      ),
   );
  }


// User will see this page first 
class cakeLoginPageMain extends State<cakeLogin> {

  String? _CustEmailInit; 
  BuildContext? loginContext;

  Future<void> callData() async {

    var custUsernameGet = await UsernameGetter().Connection(_CustEmailInit!);
    var nameValuesGet = await NameGetter().Connection(custUsernameGet);

    setState(() {
      _custUsername = custUsernameGet;
    });

    print("USERNAME: " + _custUsername);

   await Navigator.push(context, 
                          MaterialPageRoute(
                            builder: (context) => const main.cakeWidget()
                            )
                          );

  }
  @override
  void initState() {
  }

  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(
        elevation: 0,
        title: Text("Sign In",
          style: TextStyle(
            fontSize: 22,
            color: setupFontCol,
            fontWeight: FontWeight.bold
          )),
        backgroundColor: setupMainTheme,
        centerTitle: false,
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(20),
        )
      ),

      backgroundColor: setupMainTheme,
      body: Padding(
        padding: EdgeInsets.all(28),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[

            TextFormField(
              controller: _emailController,
              style: TextStyle(color: Color.fromARGB(255, 214, 213, 213)),
              decoration: InputDecoration(
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(10),
                ),
                filled: true,
                hintStyle: TextStyle(color: Color.fromARGB(255, 197, 197, 197)),
                hintText: "Enter your email",
                fillColor: setupMainTheme,
              ),
            ),

          SizedBox(
            height: 45,
            width: 500,
            child: ElevatedButton(
              style: 
                ElevatedButton.styleFrom(
                  primary: setupFontCol,
                  onPrimary: Colors.white,
                  shape: const StadiumBorder(),
                ),

              var _CustEmail = _emailController.text;

              onPressed: () {
                   _CustEmailInit = emailController.Text
                   callData();
           }
            child: Text("Sign In",
                style: TextStyle(
                  color: Colors.white,
                  fontWeight: FontWeight.normal,
                  fontSize: 16,
                )) 
          ),
      ),      
    );
  }
}

String setupTime() {
  if(_custUsername != null) {
    var hour = DateTime.now().hour;
    if (hour < 12) {
      return '   Good Morning ' + _custUsername;
    }
    if (hour < 17) {
      return '   Good Afternoon ' + _custUsername;
    }
  } 
  return '   Good Evening ' + _custUsername; // Debugger throws "Null is not a subtype type of string" error here
}

ただし、callData 関数で _custUsername の値を出力すると、「Daniel」などの期待値が返されますが、setupTime 関数内で null エラー エラーがスローされます。

私が試したこと:

setupTime() 関数内にローカル変数を作成し、そのローカル変数に _custUsername 値を割り当て、その関数の _custUsername 変数をローカルに割り当てられた変数に置き換えます。

解決策 1

これは、以前の質問と同じ問題です リストからリストビューにデータを取得しようとしている間、タイプ「null」はタイプ「string」のサブタイプではありません[[^].

あなたはでコードを見る必要があります…

ダーツ
var custUsernameGet = await UsernameGetter().Connection(_CustEmailInit!);
var nameValuesGet = await NameGetter().Connection(custUsernameGet);

setState(() {
  _custUsername = custUsernameGet;
});

…期待する値ではなくnullを返す理由を確認してください。

[edit]

こちらもご覧ください 非同期プログラミング: futures、async、await | ダーツ[^]
[/edit]

[ad_2]

コメント

タイトルとURLをコピーしました