簡體   English   中英

Flutter/Dart - 如何在類之間傳遞變量?

[英]Flutter/Dart - How to pass variables between classes?

我對編程很陌生,我試圖將一個變量 (jsonData) 從一個未來傳遞到另一個類中的另一個未來,因此可以將變量中的數據存儲在數據庫中。 不要混淆,我正在使用 API 來獲取必要的數據,這非常有效。 任何提示如何訪問變量 jsonData 以插入數據?

//first class gets the json data
class getJSONData {

Future<void> makeRequest() async {
var url = "some url";

Map inputData = {
  "Password": example,
  "SQL": sql query,
  "db_server": "server",
  "db_table": "table",
};

var body = json.encode(inputData);

var putRequest = await http.put(
    Uri.encodeFull(url), headers: {"Content-Type": "application/json"},
    body: body);

//this variable has to be stored
var jsonData = json.decode(putRequest.body);
  }
}


//data needs to be inserted here

class Database {

Future<void> insertJSON() async {
db = await openDatabase(
  join(await getDatabasesPath(), tableName),
  onCreate: (db, version) {
    return db.execute('''
     INSERT INTO $tableName(column1, column2, etc) VALUES (${jsonData["Records].data1}, ${jsonData["Records].data2}, etc)
     ''');
     }
   );
 }
}

下面我將向您展示如何在兩個屏幕之間傳遞數據:

屏幕 1:

class HomeScreenTopContainer extends StatefulWidget {
  @override
  _HomeScreenTopContainerState createState() => _HomeScreenTopContainerState();
}

class _HomeScreenTopContainerState extends State<HomeScreenTopContainer> {


  @override
  void initState() {
    // TODO: implement initState
    super.initState();

  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
       Inkwell(onTap:(){
                  Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => ParentLanding(parameter:"pass your value here")),
        );
       },child:Text("Tap Here and pass data")),
        
      ],
    );
  }
}

屏幕 2:

 class ParentLanding extends StatefulWidget {
String parameter;
 ParentLanding({Key key,String parameter}) : super(key: key,parameter:parameter);
      @override
      _ParentLandingState createState() => _ParentLandingState();
    }
    
    class _ParentLandingState extends State<ParentLanding> {
    
    
      @override
      void initState() {
        // TODO: implement initState
        super.initState();
    
      }
    
      @override
      Widget build(BuildContext context) {
        return Stack(
          children: <Widget>[
           Inkwell(onTap:(){
                     // you can use this parameter like this.
           },child:Text(**Widget.parameter**)),
            
          ],
        );
      }
    }

傳遞任何值的最簡單方法是使用參數。 值可以發送為:

 Keys.navKey.currentState.pushNamed(
      Routes.gameViewScreen, arguments: jsonData );

在另一個類中,它可以檢索為:

var jsonData = ModalRoute.of(context).settings.arguments;

你有很多選擇。 我給你推薦一個。 更改兩種方法的簽名。
例子

你的 HttpClient 類

Future<Map<String, dynamic>> makeRequest() async {
    // ... your code
    var jsonData = json.decode(putRequest.body);
    return jsonData;
}

你的數據庫類

    Future<void> insertJSON(Map<String, dynamic> jsonData) async {
        db = await openDatabase(
        join(await getDatabasesPath(), tableName),
        onCreate: (db, version) {
        return db.execute('''
           INSERT INTO $tableName(column1, column2, etc) VALUES 
            (${jsonData["Records].data1}, ${jsonData["Records].data2}, etc)
          ''');
     }
   );
 }

使用第三個類/對象/方法調用 api,獲取結果並將其傳遞給 db 類:

main() async {
    HttClient http = HttpClient();
    Database db = Database();
    final json = await http.makeRequest();
    await db.insertJSON(json);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM