2017-05-17 1 views
3

그래서 사용자를위한 알림을 표시하는 "알림"화면이 있습니다. 이 화면으로 이동할 때 알림은 백엔드 API에서 실시간으로로드되므로 공백으로 표시됩니다. 여기 백엔드 API에서 데이터를 대기하는 동안 RefreshIndicator를 처음으로 표시하는 방법은 무엇입니까?

문제를 설명하기 위해 몇 가지 코드입니다 :

class _MyItemsPageState extends State<MyItemsPage> { 
    final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey = 
     new GlobalKey<RefreshIndicatorState>(); 
    List<MyItem> _items = []; 

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

    // Nothing is displaying on screen initially, since the items are loaded from API on startup. 
    // Preferably in this state, the refresh indicator would be shown while the items load. 
    // It's not currently possible in this place, since it seems that the Widget hasn't been built yet. 

    _refreshIndicatorKey.currentState.show(); // currentState null at this time, so the app crashes. 
    _loadItems(); 
    } 

    // (unrelated code removed) 

    @override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     appBar: new AppBar(
     title: new Text(widget.title), 
    ), 
     body: new RefreshIndicator(
     key: _refreshIndicatorKey, 
     onRefresh: _loadItems, 
     child: new ListView(
      padding: new EdgeInsets.symmetric(vertical: 8.0), 
      children: _buildItemWidgets(), 
     ), 
    ), 
    ); 
    } 
} 

문제는 initState() 함수가 호출 될 때 위젯이 내장되지 않은 이후 _refreshIndicator.currentState가 null이다 아직.

show()을이 경우 RefreshIndicator에 호출하는 적절한 장소는 무엇입니까?

+0

결국,'_loadItems()'함수 안에'_refreshIndicator.currentState.show()'를 넣는 것이 트릭을 만들었습니다. 다음과 같이 표시됩니다. 'Future _loadItems() async { _refreshIndicatorKey.currentState? .show(); var items = await getItems(); setState (() { _items = items; }); }' "가장 권장되는"방법인지는 모르겠지만, 적어도 그것이 작동하는 것은 확실합니다. ¯ \\ _ (ツ))// 나는 이것이 선호되는 방법인지 계속 알고 있습니다. –

+0

자신 만의 질문에 스스로 대답 할 수 있습니다. 아래 공식적으로 답변 해 주시겠습니까? –

답변

3

내게는 _refreshIndicator.currentState.show()을 내 _loadItems() 기능을 넣는 것이 트릭을 만들었습니다. 그래서 뭔가 같은 :

Future _loadItems() async { 
    _refreshIndicatorKey.currentState?.show(); 
    var items = await getItems(); 

    setState(() { 
     _items = items; 
    }); 
} 

는 다음 나는 initState() 방법은 평소처럼 _loadItems() 함수를 호출하지만, 거기에서 _refreshIndicatorKey.currentState.show() 라인을 제거했다.

내가 인해 loadItems 함수의 async 성격 때문에 몇 가지 가능한 경쟁 조건의 이 단지 작품을 생각하고, 위젯 상태의 수명주기와 관련된 다른 솔루션이 있어야합니다 같은 느낌.