如何在flutter中正确使用http请求的数据?

问题描述

在widget中使用http请求的数据,应用显示会出红屏,widget不同提示不同,总之都是表示没有数据传入。只有在热重载两次后才能正确显示。
报错如下:Failed assertion:line x pos y:'data != null'
Simulator Screen Shot - iPhone 11 Pro Max - 2020-04-10 at 17.54.39.png
WechatIMG1.jpeg

问题出现的环境背景及自己尝试过哪些方法

原本我直接在statelesswidget里面返回Markdown(data:data.string,),发现问题后该用FutureBuilder来先处理http请求,等请求完成再渲染,但是这样写好像并不对,问题依旧,我甚至看不到定义的内容为loading的text widget。有考虑是不是应该用statefulwidget,但是也没有用。

相关代码

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

void main() => runApp(MyApp());

class DataTest {//处理http请求
  var url = 'http://xxx/tips/cardiac-arrest.md';
  var client = http.Client();
  String string;

  DataTest() {
    getClient();
  }
  Future getClient() async {
    client.get(url).then((http.Response response) {
      if (response.statusCode == 200) {
        string = response.body.toString();
      } else {
        print('erro');
      }
    });
  }
}
                                   
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter HTTP Test',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('客户端请求HTTP测试'),
        ),
        body: Center(
          child: MyStatefulWidget(),
        ),
      ),
    );
  }
}
class MyStatefulWidget extends StatefulWidget{
  @override
  MyState createState() => MyState();
}

class MyState extends State<MyStatefulWidget>{
  var data = new DataTest();

  @override
  Widget build(BuildContext context){
    return FutureBuilder(
      future: data.getClient(),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        print('data:${snapshot.data}');
        print('connectionState:${snapshot.connectionState}');
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Text('loading...');
        } else {
          return Markdown(data:data.string,);
        }
      },
    );
  }

}

你期待的结果是什么?实际看到的错误信息又是什么?

我的服务端会返回md格式的字符串,我想在页面上用markdown插件渲染出来,但是问题并不在markdown上,因为text widget也是一样的效果。

阅读 1.7k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题