How To Read ModalRoute.of(context).settings.arguments Properly?

I'm confused with flutter, when I want to read arguments from statefulwidget (initstate) and access it into widget build, the variable is still null. how to read it properly? my code is bellow :

import 'package:flutter/material.dart';
import 'package:caritokoonline_v2/components/ResultForm.dart';
import 'package:caritokoonline_v2/podo/SearchBarangRequest.dart';

class ResultBarangActivity extends StatefulWidget {
  SearchBarangRequest searchBarangRequest;

  @override
  _ResultBarangActivityState createState() => _ResultBarangActivityState();
}

class _ResultBarangActivityState extends State<ResultBarangActivity> {
  final _scaffoldKey = GlobalKey<ScaffoldState>();


  @override
  void initState(){


    Future.delayed(Duration.zero,(){
      setState(() {
        widget.searchBarangRequest = ModalRoute.of(context).settings.arguments;
        print(widget.searchBarangRequest.keyword);
      });
    });

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    if (widget.searchBarangRequest == null) return Scaffold(); //this line is always executed

    return ResultForm(
      scaffoldKey: _scaffoldKey,
      title: widget.searchBarangRequest.keyword,
      subTitle: widget.searchBarangRequest.hargaRange.toString(),);
  }
}

Thank!

Upvotes: 7

Views: 13641

Answers (1)

I know what the mistake,

so, I made global variable (title, subtitle) and assign value from searchBarangRequest like this following code :

String title = ""; String subtitle = "";

class _ResultBarangActivityState extends State<ResultBarangActivity> {
  final _scaffoldKey = GlobalKey<ScaffoldState>();


  @override
  void initState(){


    Future.delayed(Duration.zero,(){
      setState(() {
        widget.searchBarangRequest = ModalRoute.of(context).settings.arguments;
        title       = widget.searchBarangRequest.keyword;

        subtitle    = "${Utils().kondisiToString(widget.searchBarangRequest.kondisiBarang)} | ${widget.searchBarangRequest.hargaRange.toString()}";


        // print(widget.searchBarangRequest.keyword);

        getProducts(widget.searchBarangRequest);
      });
    });

    super.initState();
  }
}

and it works perfectly! thank.

Upvotes: 3

Related Questions