簡體   English   中英

Flutter Amplify DataStore 插件尚未添加到 Amplify

[英]Flutter Amplify DataStore plugin has not been added to Amplify

突然間我收到錯誤DataStore plugin has not been added to Amplify, recoverySuggestion: Add DataStore plugin to Amplify and call configure before calling DataStore related APIs以排除我在該頁面上所做的任何工作我試過了具有相同結果的新頁面。

我已經執行了amplify codegen modelsamplify pullamplify env pull 還嘗試進行flutter clean ,但我根本看不到任何變化。 我真的很困惑,似乎無法弄清楚這個問題。

我在調試時注意到的一件事是屏幕的initState似乎更早作為configureAmplify回調執行。

我將展示代碼的相關部分(抱歉,代碼太長了)。

Pubspec.yaml

dependencies:
  ...
  amplify_flutter: ^0.2.10
  amplify_datastore: ^0.2.10
  amplify_api: ^0.2.10
  amplify_auth_cognito: ^0.2.10
  amplify_storage_s3: ^0.2.10

main.dart

import 'package:flutter/material.dart';
import 'package:my_package/screens/main/teams_screen.dart';
import 'package:my_package/services/amplify_services.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

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

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    AmplifyService.configureAmplify();
  }

  @override
  Widget build(BuildContext context) {
  ...
  }
}

服務/amplify_services.dart

import 'package:flutter/foundation.dart';
import 'package:amplify_flutter/amplify.dart';
import 'package:amplify_datastore/amplify_datastore.dart';
import 'package:amplify_api/amplify_api.dart';
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';
import 'package:amplify_storage_s3/amplify_storage_s3.dart';
import 'package:my_package/models/ModelProvider.dart';
import 'package:my_package/amplifyconfiguration.dart';

class AmplifyService {
  static configureAmplify() async {
    AmplifyAPI apiPlugin = AmplifyAPI();
    AmplifyAuthCognito authPlugin = AmplifyAuthCognito();
    AmplifyStorageS3 amplifyStorageS3 = AmplifyStorageS3();
    AmplifyDataStore dataStorePlugin = AmplifyDataStore(
      modelProvider: ModelProvider.instance,
    );

    await Amplify.addPlugins([
      dataStorePlugin,
      authPlugin,
      amplifyStorageS3,
      apiPlugin,
    ]);

    try {
      await Amplify.configure(amplifyconfig);
    } on AmplifyAlreadyConfiguredException {
      if (kDebugMode) {
        print(
            "Amplify was already configured. Looks like app restarted on android.");
      }
    }
  }
}

最后是非常基本的頁面,甚至沒有 output (screens/teams_screen.dart)

import 'dart:async';
import 'package:amplify_datastore/amplify_datastore.dart';
import 'package:amplify_flutter/amplify.dart';
import 'package:flutter/material.dart';
import 'package:my_package/models/Team.dart';

class TeamsScreen extends StatefulWidget {
  const TeamsScreen({Key? key}) : super(key: key);

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

class _TeamsScreenState extends State<TeamsScreen> {
  late StreamSubscription<QuerySnapshot<Team>> _teamsSubscription;
  bool _isLoading = true;
  List<Team> teams = [];

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

  @override
  void dispose() {
    _teamsSubscription.cancel();
    super.dispose();
  }

  Future<void> _initializeApp() async {
    _teamsSubscription = Amplify.DataStore.observeQuery(Team.classType)
        .listen((QuerySnapshot<Team> snapshot) {
      setState(() {
        if (_isLoading) _isLoading = false;
        teams = snapshot.items;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

新的一天,新的心靈。 問題變得非常簡單,我沒有設置_isLoading state 來指示是否潮濕, configureAmplify回調已完成,讓應用程序繼續加載所有其他觸發錯誤的屏幕。 因此,在設置 state 並僅在 state 更改后添加應用程序的 rest 后,它可以正常工作。

為了解決它,我做了以下事情:

import 'package:flutter/material.dart';
import 'package:my_package/screens/main/teams_screen.dart';
import 'package:my_package/services/amplify_services.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

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

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    _initializeApp();
  }

  Future<void> _initializeApp() async {
    await AmplifyService.configureAmplify(); // note the await!

    setState(() {
      _isLoading = false; // important to set the state!
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: _isLoading 
          ? Center(child: CircularProgressIndicator())
          : const MainScreen(), // _isLoading is very important here.
    );
  }
}

暫無
暫無

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

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