首页 > 解决方案 > Flutter - 将 JSON 文件从 url 移动到资产文件夹

问题描述

我是 Flutter 的新手,我需要你的帮助。我正在尝试将 json 文件从 url 移动到资产文件夹,我无法考虑应该对代码进行哪些更改以便它可以工作。

我试图修复它,但我不能,如果有人可以帮助解决这个问题,我将不胜感激。

这是我的代码:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'user.dart';

void main() {
  runApp(new MaterialApp(home: HomePage()));
}
class HomePage extends StatefulWidget {
  @override
  HomePageState createState() => HomePageState();
}

List data;
List<User> userlist = List();
List<User> usersavedlist = List();
int index;

class HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'UserList Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: Text('UserList Flutter'),
          actions: <Widget>[
            IconButton(icon: const Icon(Icons.list), onPressed: _pushSaved),
          ],
        ),
        body: listView(),
      ),
    );
  }

  Future<String> fetchData() async {
    final url =
        'https://raw.githubusercontent.com/highmobdevelopment/userlist/master/contacts.json';
    final response = await http.get(url);

    if (response.statusCode == 200) {
      print('succesfull parse');

      this.setState(() {
        data = json.decode(response.body);
        data.forEach((element) => userlist.add(new User.fromJson(element)));
      });
    }

    return "Success!";
  }

  @override
  void initState() {
    super.initState();
    fetchData();
  }

  listView() {
    return ListView.builder(
      itemCount: userlist == null ? 0 : userlist.length,
      itemBuilder: (context, index) {
        return Column(
          children: <Widget>[_buildRow(index, userlist), const Divider()],
        );
      },
    );
  }

  Widget _buildRow(index, userlist) {
    final bool alreadySaved = usersavedlist.contains(userlist[index]);

    return ListTile(
      title: Text(
        userlist[index].name

请寻求您的支持以解决此问题。

标签: jsonflutterdart

解决方案


你需要这样做,await fetchData()因为它会返回一个未来。你initState()可能看起来像这样:

   @override
   void initState() {
     super.initState();
     Future.microtask(() async {
       await fetchData();
     });
   }

推荐阅读