Задание заголовка AppBar с использованием JSON при отображении ошибки - PullRequest
1 голос
/ 03 марта 2020

У меня есть приложение, созданное с использованием флаттера, но оно отображает ошибку, показывающую, что метод [] возвращает ноль.

Я действительно не понимаю, где находится местоположение. и исключение, выданное в первой строке, приводит к тому, что когда я устанавливаю title в AppBar .

I/flutter ( 6601): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 6601): The following NoSuchMethodError was thrown building HomePage(dirty, state: _HomePageState#b5688):
I/flutter ( 6601): The method '[]' was called on null.
I/flutter ( 6601): Receiver: null
I/flutter ( 6601): Tried calling: []("title")
I/flutter ( 6601):
I/flutter ( 6601): The relevant error-causing widget was:
I/flutter ( 6601):   HomePage                                                                                   package:blogger/main.dart:13
I/flutter ( 6601):
I/flutter ( 6601): When the exception was thrown, this was the stack:
I/flutter ( 6601): #0      Object.noSuchMethod  (dart:core-patch/object_patch.dart:53:5)
I/flutter ( 6601): #1      _HomePageState.build                                                                 package:blogger/main.dart:47
I/flutter ( 6601): #2      StatefulElement.build                                                                package:flutter/…/widgets/framework.dart:4334
I/flutter ( 6601): #3      ComponentElement.performRebuild                                                      package:flutter/…/widgets/framework.dart:4223
I/flutter ( 6601): #4      Element.rebuild                                                                      package:flutter/…/widgets/framework.dart:3947
I/flutter ( 6601): #5      ComponentElement._firstBuild                                                         package:flutter/…/widgets/framework.dart:4206
I/flutter ( 6601): #6      StatefulElement._firstBuild                                                          package:flutter/…/widgets/framework.dart:4381
I/flutter ( 6601): #7      ComponentElement.mount                                                               package:flutter/…/widgets/framework.dart:4201
I/flutter ( 6601): #8      Element.inflateWidget 

.....

I/flutter ( 6601): #329    RenderObjectToWidgetAdapter.attachToRenderTree                                       package:flutter/…/widgets/binding.dart:941
I/flutter ( 6601): #330    WidgetsBinding.attachRootWidget                                                      package:flutter/…/widgets/binding.dart:819
I/flutter ( 6601): #331    WidgetsBinding.scheduleAttachRootWidget.<anonymous closure>                          package:flutter/…/widgets/binding.dart:804
I/flutter ( 6601): #340    _Timer._runTimers  (dart:isolate-patch/timer_impl.dart:384:19)
I/flutter ( 6601): #341    _Timer._handleMessage  (dart:isolate-patch/timer_impl.dart:418:5)
I/flutter ( 6601): #342    _RawReceivePortImpl._handleMessage  (dart:isolate-patch/isolate_patch.dart:174:12)
I/flutter ( 6601): (elided 8 frames from package dart:async and package dart:async-patch)
I/flutter ( 6601):
I/flutter ( 6601): ════════════════════════════════════════════════════════════════════════════════════════════════════

Ошибка появляется только когда я изменяю заголовок AppBar путем извлечения контента из json. и когда я устанавливаю это прямо так, то ошибка не появляется. в том смысле, что здесь нет ошибок.

 @override
  Widget build(BuildContext context) {
    return Scaffold (
      appBar: AppBar(
        title: Text("My Title"),
      ),
    );
  }

ниже приведен весь программный код, над которым я работаю.

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

import 'dart:async';
import 'dart:convert';

void main () {
  runApp(MaterialApp(
    title: "Blogger App",
    theme: new ThemeData(
      primarySwatch: Colors.yellow
    ),
    home : HomePage(),
  ));
}

class HomePage extends StatefulWidget {
  HomePage({Key key}) : super(key: key);

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

class _HomePageState extends State<HomePage> {

  Map data, feed;

  Future getData() async {
    http.Response response = await http.get("https://www.haliminfo.com/feeds/posts/summary/?max-results=5&alt=json");
    data = json.decode(response.body);
    setState(() {
      feed = data['feed']; 
    });
  }

  @override
  void initState() { 
    super.initState();
    this.getData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold (
      appBar: AppBar(
        title: Text(feed['title']['\$t'].toString()),
      ),
    );
  }
}

, то как тогда, когда я изменю заголовок в AppBar с использованием JSON, который я взял из inte rnet ошибки нет?

спасибо

1 Ответ

1 голос
/ 03 марта 2020

Вызов вызова API - это асинхронный c процесс (который может занять некоторое время для извлечения JSON со страницы), так как ваш объект 'feed' является нулевым во время создания исключения активности будет брошенный.

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

import 'dart:async';
import 'dart:convert';

void main () {
  runApp(MaterialApp(
    title: "Blogger App",
    theme: new ThemeData(
      primarySwatch: Colors.yellow
    ),
    home : HomePage(),
  ));
}

class HomePage extends StatefulWidget {
  HomePage({Key key}) : super(key: key);

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

class _HomePageState extends State<HomePage> {

  Map data, feed;
  String appTitle = '';


  Future getData() async {
    http.Response response = await http.get("https://www.haliminfo.com/feeds/posts/summary/?max-results=5&alt=json");
    data = json.decode(response.body);
    setState(() {
      feed = data['feed']; 
      appTitle = feed['title']['\$t'].toString();
    });
  }

  @override
  void initState() { 
    super.initState();
    this.getData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold (
      appBar: AppBar(
        title: Text(appTitle),
      ),
    );
  }
}
...