【问题标题】:Flutter post HTTP requestFlutter 发布 HTTP 请求
【发布时间】:2021-09-23 12:06:17
【问题描述】:

我正在尝试发送一个发布请求,然后得到一些响应。这是网站:www.reqres.in 和用户数据https://reqres.in/api/users

当我按下按钮时,我看不到任何文字。将姓名和工作发布到 API 并接收姓名、ID、日期时间和工作。如果我不使用小部件 _showData 并在文本字段下方的构建中显示文本,那么我会看到数据,但有一个 lateInitialization 错误,但我想使用小部件 _showData 显示它。

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:http_req_advanced/usermodel.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'HTTP Request 2',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var users;
  Future<UserModel> createUser(String name, String job) async {
    final apiUrl = "https://reqres.in/api/users";
    final response =
        await http.post(Uri.parse(apiUrl), body: {"name": name, "job": job});

    if (response.statusCode == 201) {
      users = userModelFromJson(response.body);
    } else
      throw Exception('Failed to load');
    return users;
  }

  late UserModel user;

  final nameController = TextEditingController();
  final jobController = TextEditingController();
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        appBar: AppBar(
          title: Text('HTTP Request'),
        ),
        body: Container(
          padding: EdgeInsets.all(16),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              TextField(
                controller: nameController,
              ),
              TextField(
                controller: jobController,
              ),
              //Text(
                 // "The user ${user.name} ${user.id} is created at ${user.createdAt} with job${user.job}"),
              ElevatedButton(
                onPressed: () async {
                  final String name = nameController.text;
                  final String job = jobController.text;

                  final UserModel userr = await createUser(name, job);

                  setState(() {
                    user = userr;
                     _showData(user.name, user.job, user.id, user.createdAt);
                  });
                },
                child: Text('Make a Request'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Widget _showData(String name, String job, String id, DateTime createdat) {
    return Container(
      alignment: Alignment.bottomCenter,
      child: SizedBox(
        height: 32,
        child:
            Text('The user $name [$id] is created at $createdat with job $job'),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter api http dart post


    【解决方案1】:

    而不是使用后期初始化:

    late UserModel user;
    

    用途:

    UserModel? user;
    

    当您使用late 时,您声明了一个稍后将被初始化的非空变量,在这种情况下您不需要使用late,因为user 可以为空。

    【讨论】:

      【解决方案2】:
          import 'package:flutter/material.dart';
          import 'package:http/http.dart' as http;
          import 'package:http_req_advanced/usermodel.dart';
          
          void main() {
            runApp(MyApp());
          }
          
          class MyApp extends StatelessWidget {
            const MyApp({Key? key}) : super(key: key);
          
            @override
            Widget build(BuildContext context) {
              return MaterialApp(
                title: 'HTTP Request 2',
                home: MyHomePage(),
              );
            }
          }
          
          class MyHomePage extends StatefulWidget {
            @override
            _MyHomePageState createState() => _MyHomePageState();
          }
          
          class _MyHomePageState extends State<MyHomePage> {
            var users;
            Future<UserModel> createUser(String name, String job) async {
              final apiUrl = "https://reqres.in/api/users";
              final response =
                  await http.post(Uri.parse(apiUrl), body: {"name": name, "job": job});
          
              if (response.statusCode == 201) {
                users = userModelFromJson(response.body);
              } else
                throw Exception('Failed to load');
              return users;
            }
          
            late UserModel user;
          
            final nameController = TextEditingController();
            final jobController = TextEditingController();
            @override
            Widget build(BuildContext context) {
              return SafeArea(
                child: Scaffold(
                  appBar: AppBar(
                    title: Text('HTTP Request'),
                  ),
                  body: Container(
                    padding: EdgeInsets.all(16),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        TextField(
                          controller: nameController,
                        ),
                        TextField(
                          controller: jobController,
                        ),
                        user != null
                            ? _showData(user.name, user.job, user.id, user.createdAt)
                            : Container(),
                            //Text(
                            // "The user ${user.name} ${user.id} is created at ${user.createdAt} with job${user.job}"),
                            ElevatedButton(
                                onPressed: () async {
                                  final String name = nameController.text;
                                  final String job = jobController.text;
          
                                  final UserModel userr = await createUser(name, job);
          
                                  setState(() {
                                    user = userr;
                                  });
                                },
                                child: Text('Make a Request'),
                              ),
                      ],
                    ),
                  ),
                ),
              );
            }
          
            Widget _showData(String name, String job, String id, DateTime createdat) {
              return Container(
                alignment: Alignment.bottomCenter,
                child: SizedBox(
                  height: 32,
                  child:
                      Text('The user $name [$id] is created at $createdat with job $job'),
                ),
              );
            }
          }
      

      【讨论】:

      • 给出错误,延迟初始化错误。字段“用户”尚未初始化。
      猜你喜欢
      • 1970-01-01
      • 2020-10-14
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多