簡體   English   中英

flutter riverpod ConsumerWidget 未重建

[英]flutter riverpod ConsumerWidget not being rebuilt

我剛剛將riverpod 實現到我編寫的一個小應用程序中。

flutter_riverpod: ^0.12.1

我的問題是,當我更新提供者時,盡管調用了“watch”,但小部件並沒有被重建。

提供者本質上跟蹤應該顯示的當前頁面。

import 'dart:developer';

import 'package:flutter_riverpod/flutter_riverpod.dart';

final currentPageProvider = StateNotifierProvider((ref) => CurrentPage());

class CurrentPage extends StateNotifier<int> {
  CurrentPage() : super(-1);

  set currentPage(int page) {
    log('currentPage set to $page');
    state = page;
  }

  int get currentPage => state;
}

PageButtons 小部件繪制一組 RaisedButtons。 當用戶單擊其中一個凸起的按鈕時,當前頁面編號。 應該更改並且應該重建 PageButton 小部件,以便我們可以更改與當前頁面對應的 RaisedButton 的顏色。

import 'dart:developer';
import 'dart:math' hide log;

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fsm2/fsm2.dart' hide State;
import 'package:fsm2_viewer/src/providers/current_page.dart';
import 'package:fsm2_viewer/src/providers/log_provider.dart';

class PageButtons extends ConsumerWidget {
  final List<SvgFile> pages;
  PageButtons(this.pages);

  @override
  Widget build(BuildContext context, ScopedReader watch) {
    /// watch the currentPageProvider so we are rebuilt when the page
    /// no changes.
    int currentPage = watch(currentPageProvider).currentPage;
    log('building PageButons currentPage: $currentPage');
    if (pages.length == 0) {
      return Container(width: 0, height: 0);
    }

    currentPage = min(currentPage, pages.length - 1);

    var buttons = <Widget>[];
    for (var pageNo = 0; pageNo < pages.length; pageNo++) {
      buttons.add(Padding(
          padding: EdgeInsets.only(right: 5, left: 5),
          child: RaisedButton(
              color: (pageNo == currentPage ? Colors.blue : Colors.grey),
              onPressed: () {
                context.read(logProvider).log = 'onpressed';
                /// User click the page button so update the current page.
                context.read(currentPageProvider).currentPage = pageNo;
                context.read(logProvider).log = 'changed to page $pageNo';
              },
              child: Text('${pageNo + 1}'))));
    }
    return Row(children: buttons);
  }
}

你可以在上面的構建方法中看到我稱之為watch:

 int currentPage = watch(currentPageProvider).currentPage;

然后在 onPressed for a Raised 按鈕中更新 currentPage:

              onPressed: () {
                /// User click the page button so update the current page.
                context.read(currentPageProvider).currentPage = pageNo;
                context.read(logProvider).log = 'onpressed';                
                context.read(logProvider).log = 'changed to page $pageNo';

在我的日志中,我看到:

main:ALL> onpressed
main:ALL> currentPage set to 1
main:ALL> changed to page 1

日志告訴我正在調用 onPressed 方法,並且我正在更新 currentPageProvider。

但是沒有調用 PageButtons 的構建器。

我究竟做錯了什么?

    import 'dart:developer';
import 'dart:math' hide log;

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fsm2/fsm2.dart' hide State;
import 'package:fsm2_viewer/src/providers/current_page.dart';
import 'package:fsm2_viewer/src/providers/log_provider.dart';

class PageButtons extends ConsumerWidget {
  final List<SvgFile> pages;
  PageButtons(this.pages);

  @override
  Widget build(BuildContext context, ScopedReader watch) {
    /// watch the currentPageProvider so we are rebuilt when the page
    /// no changes.
    int currentPage = watch(currentPageProvider.state);
    log('building PageButons currentPage: $currentPage');
    if (pages.length == 0) {
      return Container(width: 0, height: 0);
    }

    currentPage = min(currentPage, pages.length - 1);

    var buttons = <Widget>[];
    for (var pageNo = 0; pageNo < pages.length; pageNo++) {
      buttons.add(Padding(
          padding: EdgeInsets.only(right: 5, left: 5),
          child: RaisedButton(
              color: (pageNo == currentPage ? Colors.blue : Colors.grey),
              onPressed: () {
                context.read(logProvider).log = 'onpressed';
                /// User click the page button so update the current page.
                context.read(currentPageProvider).currentPage = pageNo;
                context.read(logProvider).log = 'changed to page $pageNo';
              },
              child: Text('${pageNo + 1}'))));
    }
    return Row(children: buttons);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM